(五)BeautifulSoup库

来源:互联网 发布:基本数据分析方法 编辑:程序博客网 时间:2024/05/21 14:41

利用它就不用编写正则表达式也能方便的实现网页信息的抓取

soup = BeautifulSoup(html,'lxml')print(soup.prettify())print(soup.title)print(soup.title.name)print(soup.title.string)print(soup.title.parent.name)print(soup.p)print(soup.p["class"])print(soup.a)print(soup.find_all('a'))print(soup.find(id='link3'))

通过这种soup.标签名 就可以获得这个标签的内容当我们通过soup.title.name的时候就可以获得该title标签的名称,即title

print(soup.p.attrs[‘name’])
print(soup.p[‘name’])
上面两种方式都可以获取p标签的name属性值

print(soup.p.string)
结果就可以获取第一个p标签的内容

直接可以通过下面嵌套的方式获取
print(soup.head.title.string)

子节点和子孙节点

contents的使用

from bs4 import BeautifulSoupsoup = BeautifulSoup(html,'lxml')print(soup.p.contents)

结果是将p标签下的所有子标签存入到了一个列表中

通过下面的方式也可以获取p标签下的所有子节点内容和通过contents获取的结果是一样的,但是不同的地方是soup.p.children是一个迭代对象,而不是列表,只能通过循环的方式获取素有的信息

print(soup.p.children)for i,child in enumerate(soup.p.children):    print(i,child)

通过contents以及children都是获取子节点,如果想要获取子孙节点可以通过descendants
print(soup.descendants)同时这种获取的结果也是一个迭代器

通过soup.a.parent就可以获取父节点的信息

通过list(enumerate(soup.a.parents))可以获取祖先节点,这个方法返回的结果是一个列表,会分别将a标签的父节点的信息存放到列表中,以及父节点的父节点也放到列表中

soup.a.next_siblings 获取后面的兄弟节点
soup.a.previous_siblings 获取前面的兄弟节点
soup.a.next_sibling 获取下一个兄弟标签
souo.a.previous_sinbling 获取上一个兄弟标签

find_all

find_all(name,attrs,recursive,text,**kwargs)

可以根据标签名,属性,内容查找文档

from bs4 import BeautifulSoupsoup = BeautifulSoup(html, 'lxml')print(soup.find_all('ul'))print(type(soup.find_all('ul')[0]))

结果返回的是一个列表的方式

同时可以针对结果再次find_all,从而获取所有的li标签信息

for ul in soup.find_all('ul'):    print(ul.find_all('li'))
from bs4 import BeautifulSoupsoup = BeautifulSoup(html, 'lxml')print(soup.find_all(attrs={'id': 'list-1'}))print(soup.find_all(attrs={'name': 'elements'}))

attrs可以传入字典的方式来查找标签,但是这里有个特殊的就是class,因为class在python中是特殊的字段,所以如果想要查找class相关的可以更改attrs={‘class_’:’element’}或者soup.find_all(”,{“class”:”element}),特殊的标签属性可以不写attrs,例如id

from bs4 import BeautifulSoupsoup = BeautifulSoup(html, 'lxml')print(soup.find_all(text='Foo'))

结果返回的是查到的所有的text=’Foo’的文本

find

find(name,attrs,recursive,text,**kwargs)
find返回的匹配结果的第一个元素

find_parents()返回所有祖先节点,find_parent()返回直接父节点。
find_next_siblings()返回后面所有兄弟节点,find_next_sibling()返回后面第一个兄弟节点。
find_previous_siblings()返回前面所有兄弟节点,find_previous_sibling()返回前面第一个兄弟节点。
find_all_next()返回节点后所有符合条件的节点, find_next()返回第一个符合条件的节点
find_all_previous()返回节点后所有符合条件的节点, find_previous()返回第一个符合条件的节点

标签1,标签2 找到所有的标签1和标签2
标签1 标签2 找到标签1内部的所有的标签2
[attr] 可以通过这种方法找到具有某个属性的所有标签
通过select()直接传入CSS选择器就可以完成选择

from bs4 import BeautifulSoupsoup = BeautifulSoup(html, 'lxml')print(soup.select('.panel .panel-heading'))print(soup.select('ul li'))print(soup.select('#list-2 .element'))print(type(soup.select('ul')[0]))

通过get_text()就可以获取文本内容

from bs4 import BeautifulSoupsoup = BeautifulSoup(html, 'lxml')for li in soup.select('li'):    print(li.get_text())

获取属性

from bs4 import BeautifulSoupsoup = BeautifulSoup(html, 'lxml')for ul in soup.select('ul'):    print(ul['id'])    print(ul.attrs['id'])
原创粉丝点击