读Bsautiful Soup库有感

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选择器有

  1. .classname:选取样式值为classname的节点
  2. nodename:选取节点名为Nodename的节点
    3.#idname:寻去id属性值为idname的节点
    返回的因该是个列表,可以使用索引的方法提取元素

嵌套选择器

就是在选取了一些节点的情况下,还可以继续使用CSS选择器。但这里你要知晓自己目前所在的标签在哪

获取属性值和文本

之前上面使用attrs可以返回属性值,这里同样可以,因为select()方法返回的是Tag对象的集合。
获取问版本可以使用string,也可以使用CSS选择器特有的get_text()方法

上一篇:Python selenium


下一篇:解析爬取内容