beautifulsoup学习记录
BeautifulSoup库总结
1、BeautifulSoup库作用
2、BeautifulSoup()方法
3、find()、find_all()、selector()、get()方法
1、BeautifulSoup库作用
- 用于将爬取到的网页源码(用requests库完成)解析为soup文档,这样做的好处是可以再用BeautifulSoup库中的过滤函数(方法)过滤提取数据
2、BeautifulSoup()方法
-
基本用法:
from bs4 import BeautifulSouop
soup = BeautifulSoup(res.text,'html.parser')这里res是用request的get方法得到的数据,这里暂时省略。
print(soup.prettify())
BeautifulSoup方法将res.text(注意要是text格式)解析成标准的html缩进格式数据放入变量'soup'中,这时'soup'是一个soup对象,可以使用BeautifulSoup库的其他方法来提取想要的内容具体看下面的方法。
BeautifulSoup支持的解析器如下:
解析器名 使用方法 优点 缺点 Python标准库 BeautifulSoup(markup,"html.parser") Python内置,速度适中,文档容错能力强 旧版本存在容错能力差的情况 lxml HTML解析器 BeautifulSoup(markup,"lxml") 速度快,文档容错能力强;(推荐) 需要安装C库 Lxml XML解析器 BeautifulSoup(markup,"xml") 速度快,唯一支持XML的解析器 同上 html5lib BeautifulSoup(markup,"html5lib") 容错性最好,以浏览器方式解析文档,生成HTML5格式的文档 速度慢
3、find()、find_all()、selector()、get()方法
-
find_all()方法
soup.find_all('div',"item")查找div标签,class = "item"
soup.find_all('div',class = 'item') #结果和前一句一样
soup.find_all('div',attrs = {"class":"item"}) #attrs参数定义一个字典参数来搜索包含特殊属性的tag
find_all()方法搜索当前soup对象的所有tag子节点(soup对象就是由各种html节点构成的)并判断是否符合过滤器的条件:
find_all(name,attrs/class,recursive,string,**kwargs)
name参数可以查找所有标签名为name的tag
1、字符串对象自动忽略掉
例:soup.find_all("title")
1.2、多标签搜索
例:soup.find_all(name = ['div','p'])
2、基于标签属性查找如:attrs/class_/id/title/...
2.1、通用方式属性搜索——attrs
soup.find_all(attrs = {'data-custom':'custom'})
2.2、css类名搜索——class_ (注意下划线)
通过class_参数搜索由指定css类名的tag(可简写):
soup.find_all("a","sister")#class_ = "sister"
若tag的class属性是多值属性,按照css类名搜索tag时,可以分别搜索tag中的每个css类名:
例如:
CSS_soup = BeautifulSoup('<p class = "body strikeout">')
CSS_soup.find_all("p",class_ = "strikeout") #<p class = "body strikeout">
CSS_soup.find_all("p",class_ = "body")
也可以通过CSS值完全匹配来查找
3、string
3.1、搜索文档中的字符串内容,string参数接受字符串,正则表达式,列表,True。
3.2、与其他参数混合过滤
soup.find_all("a",string = "Else")
soup的内容为:[<a href = "http..." class = "sister">Else]
4、限定直接子节点——recursive
加入参数recursive = False 则会只搜索tag的直接子节点
-
selector方法
soup.select('div.item > a > h1')
要加单引号,括号内容可以通过浏览器复制得到(鼠标右键目标内容然后点击copy selector
!!!li:nth-child(1)需要改为li:nth-of-type(1)
需要注意这种方法得到的结果是会带有标签的,使用get_text()方法即可获得其中的文本内容
即在使用完select后再soup2 = soup.get_text().strip()
补充:
strip()函数是用于移除字符串开头和末尾的指定字符(默认为空格)或字符序列的方法。下面是使用strip()函数的基本语法:
string.strip([characters])
其中,string是要操作的字符串,characters是可选参数,用于指定要移除的字符或字符序列。下面是一些示例:
移除字符串开头和末尾的空格:
s = " Hello, World! "
print(s.strip()) # 输出: "Hello, World!"
移除字符串开头和末尾的指定字符:
s = "Hello, World!"
print(s.strip("*")) # 输出: "Hello, World!"
移除字符串开头和末尾的多个指定字符序列:
s = "~Hello,World~~~"
print(s.strip("~")) # 输出: "Hello, World!"
需要注意的是,strip()函数返回一个新的字符串,并不会修改原始字符串。如果想要移除字符串中间的字符,可以考虑使用其他字符串处理方法,比如replace()函数或正则表达式等。
-
get()方法
BeautifulSoup解析得到的soup对象有一个get()方法。该方法用于获取标签(HTML元素)的属性值。
使用get()方法时,你需要传递属性名作为参数。如果该属性存在,get()方法将返回对应的属性值;如果属性不存在,get()方法可以返回默认值(可选参数)或者None。
注意区分字典、requests库和beautifulsoup库中的get方法,它们的作用分别是取键值、向网址请求获取网页资源、获取属性值。