内容是以前的学习笔记,内容不全,主观性较大,欢迎参考
解析器
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_data,'lxml') #解析器中'lxml'快,'html.parser'内置较快
print(soup.prettify()) # 整理成清晰标准的文档树,遗失的根元素会补齐并转小写
find() / find_all()
find_all(self,name=None,attrs={},recursive=True,text=None,limit=None,**kwargs)
-
name: 要查找的tag标签名称,默认为None,即查找所有元素
tag = soup.find('p')
-
attrs: 查找含有指定属性的元素,字典形式
tag = soup.find_all('p',attrs={'class':'title'})
也可以不用字典形式直接传入
tag = soup.find(class_ = 'title')
-
recursive: 是否在元素节点子树下全范围查找,默认是True
tips:
-
查找完成后需要获取元素某个属性:
tag['href'] # 即tag[attrs]
(注意:
tag['class']
返回的不是字符串而是列表)
text = "<div class = 'style xxx'>"
tag = soup.find('div') # 也可写作 tag = soup.div
tag['class'] == ['style','xxx']
-
查找完成后需要获取元素名称:
tag.name
-
查找完成后需要获取元素文本(也包含所有子孙节点文本):
tag.text
tag.string
tag.get_text()
-
查找完成后判断元素是否含某个属性:
tag.has_attr('href')
-
查找完成后是多个节点的生成器列表:
list(tag)[0].text
list(tag)[0].attrs['class']
自定义函数高级查找
def myFilter(tag)
results = tag.name=='a' and tag.has_attr['href'] and tag['href']==''
return results
soup = BeautifulSoup(html_data,'lxml')
tag = soup.find_all(myFilter)
print(tag)
CSS选择器
tag.select(CSS)
返回的是bs4.element.Tag的列表
-
soup.select(div p)
查找<div>下面所有子孙节点<p>
-
soup.select(div > p)
查找<div>下面所有直接子节点<p>,'>'前后必须有空格
-
soup.select(div > p:nth-of-type(3))
查找<div>下面第三个直接子节点<p>
-
soup.select(p[class = 'title style'] a)
查找所有含有class='title'的<p>节点下的所有<a>节点
也可以写为
soup.select(p.title.style a)
-
soup.select(p [class] a)
查找所有<p>节点下所有具有class属性节点下的所有<a>节点
-
soup.select(div ~ p)
查找<div>所有同级别兄弟节点<p>,'~'前后必须有空格
-
soup.select(div + p)
查找<div>后面第一个同级别兄弟节点<p>,'+'前后必须有空格
属性的语法规则:
选择器 | 描述 |
---|---|
[attrs ^= value] | 匹配属性值以指定值开头的每个元素 |
[attrs $= value] | 匹配属性值以指定值结尾的每个元素 |
[attrs *= value] | 匹配属性值中包含指定值的每个元素 |
遍历HTML树
- 所有父节点
tag = soup.find('p')
while tag:
print(tag.name)
tag = tag.parent
- 所有直接子节点
tag = soup.find('p')
for x in tag.children:
print(x.name)
- 所有子孙节点
tag = soup.find('p')
for x in tag.desendants:
print(x) # 子孙节点包括text等
- 临近兄弟节点
- 前一个兄弟节点:
tag.previous_sibling
- 后一个兄弟节点:
tag.next_sibling
UnicodeDammit()
属于bs4库,用于识别response文本的编码并转换
from bs4 import UnicodeDammit
Dammit = UnicodeDammit(data,['utf-8','gbk']) # 识别
data = Dammit.unicode_markup # 转换
可用下列代码识别编码
from bs4 import BeautifulSoup
import urllib.request
content = urllib.request.urlopen(url)
soup = BeautifulSoup(content)
print(soup.original_encoding)
# > utf-8
网友评论