Beautiful Soup库](https://www.cnblogs.com/wkhzwmr/p/15230635.html)
Bequtiful会自动将输入的文档转化为Unicode编码,输出文档转化为UTF-8编码。一般在使用的过程中不需要考虑编码的问题,除非文档没有指定编码,这啥意思呢,是指爬取下来的文档还是啥,摸棱两可。
使用Beautiful Soup库
1.创建个Beautiful Soup对象
使用BeautifulSoup()类,该类第一个参数需要指定待分析的html代码,第二个参数指定lxml解析器(第二个参数加引号(''))
在解析HTML的过程中BeautifulSoup对象会将HTML中的各个级别的标签映射成对象中同级别的属性。
节点选择器
可以通过节点的名称来选取节点,然后再用string属性就可以得到节点内的文本
节点的属性是attrs
嵌套选择节点
通过BeautifulSoup对象的属性获得的每一个节点都是一个bs4.element.Tag对象。在该对象的基础上同样可以使用节点选择器进行下一步的选择,也就是继续选择Tag对应的节点的子节点。
soup = BeautifulSoup(html,'lxml')
head = soup.head
print(head.title.string)
选择子节点
1.直接获取子节点
通过contents和childern返回一个可迭代对象
2.获取所有子孙节点
可以属性descendants属性,该属性返回一个产生器,需要使用for循环迭代才可以输出产生器的值
选择父节点
parent属性返回某个节点的直接父节点
parents属性会返回一个可迭代对象,获得当前节点所有的父节点对应的Tag对象
print(soup.a.parent)
print(soup.a.parent['class'])
for parent in soup.a.parents:
print('<',parent.name,'>')
选择兄弟节点
next_sibling属性获得当前节点的下一个兄弟节点,previous_sibling属性获得当前节点的上一个兄弟节点,
next_siblings属性获得当前节点后面的所有兄弟节点,
previous_siblings属性获得当前节点前面的所有兄弟节点,
方法选择器
find_all方法用于根据节点名、属性、文本内容等选择符合要求的节点。
常用的参数有name、attrs和text
name参数用于指定节点名,find_all方法会选取所有节点名为name参数值相同的节点,find_alll方法返回一个bs4.element.ResultSet对象,该对象是可迭代的。
soup = BeautifulSoup(html,'lxml')
ulTags = soup.find_all(name='ul')
attrs参数通过节点的属性查找,attrs参数是一个字典类型,key是节点属性名,value是节点属性值。
虾米那使用attrs参数
tags = soup.find_all(class_='item2')
print(tags)
tags = soup.find_all(id='button1')
print(tags)
text参数可以搜索匹配的文本节点,传入的参数是字符串,也可以是正则表达式对象(经过re.compile()编译的表达式)
tags = soup.find_all(text='geekori.com')
print(tags)
tags = soup.find_all(text=re.compile('Hello'))
find方法
find方法用于查询满足条件的第一个节点,而find_all方法用于查询所有满足条件的节点
find方法和find_all方法的参数和使用方法完全相同
CSS选择器
使用Tag对象的select()方法,该方法接收一个字符串类型的CSS选择器,常用的CSS选择器有
- .classname:选取样式值为classname的节点
- nodename:选取节点名为Nodename的节点
3.#idname:寻去id属性值为idname的节点
返回的因该是个列表,可以使用索引的方法提取元素
嵌套选择器
就是在选取了一些节点的情况下,还可以继续使用CSS选择器。但这里你要知晓自己目前所在的标签在哪
获取属性值和文本
之前上面使用attrs可以返回属性值,这里同样可以,因为select()方法返回的是Tag对象的集合。
获取问版本可以使用string,也可以使用CSS选择器特有的get_text()方法