- BeautifulSoup是什么?
BeautifulSoup是python 的HTML和XML的解析库,可以方便的从网页中提取数据
- 准备工作!!
正确安装好BeautifulSoup和lxml
- 节点选择器
直接调用节点名称可以选择节点元素,再调用string属性就可以得到节点内文本(这种选择方式速度快,适用于单个节点)
栗子:soup.p.string 获取到的是p标签的文本内容
(多个节点时,这种只能获取到第一个节点内容)
- 提取信息
获取节点名称
利用name属性获取节点名称
from bs4 import BeautifulSoup soup = BeautifulSoup('<p>Study</p>','lxml') # 获取节点名称 print(soup.p.name) # 获取节点文本值 print(soup.p.string)
获取节点属性
利用attrs获取节点所有属性
from bs4 import BeautifulSoup soup = BeautifulSoup('<p class="test" id="abc" name="efg">Study</p>','lxml') # 获取节点名称 print(soup.p.name) # 获取节点文本值 print(soup.p.string) # 获取节点属性 print(soup.p.attrs) # 获取某个节点属性值 print(soup.p.attrs['name'])
嵌套选择
from bs4 import BeautifulSoup soup = BeautifulSoup('<html class="test" id="abc" name="efg"><head><title>Study</title></head></html>','lxml') print(soup) # 嵌套选择,获取节点名称 print(soup.head.title.name) # 获取节点文本 print(soup.head.title.string)
关联选择
利用contents属性获取节点下所有直接子节点,多个返回的是直接子节点的列表
from bs4 import BeautifulSoup html = ''' <html><head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>错误 _ 火狐主页</title> </head> <body> 抱歉,页面丢失或拒绝服务,您可以访问: <ul> <li><a title="火狐主页" href="http://i.firefoxchina.cn/">火狐主页</a></li> <li><a title="火狐浏览器" href="http://firefox.com.cn/">火狐浏览器</a></li> <li><a title="火狐中文网" href="http://www.firefoxchina.cn/">火狐中文网</a></li> </ul> </body></html> ''' soup = BeautifulSoup(html, 'lxml') print(soup.ul.contents)
利用children获取节点的子孙节点,返回结果生成器类型,for循环输出
soup = BeautifulSoup(html, 'lxml') # print(soup.ul.contents) print(soup.ul.children) for i, child in enumerate(soup.ul.children): print(i, child)
获取所有子孙节点信息,利用descendants属性
soup = BeautifulSoup(html, 'lxml') # print(soup.ul.contents) # print(soup.ul.children) # for i, child in enumerate(soup.ul.children): # print(i, child) print(soup.body.descendants) for i,child in enumerate(soup.body.descendants): print(i,child)
父节点
利用parent获取某个节点的父节点
soup = BeautifulSoup(html, 'lxml') print(soup.li.parent)
祖先节点
利用paraents获取某个节点的祖先节点,返回的是生成器类型
soup = BeautifulSoup(html, 'lxml') # print(soup.li.parent) print(soup.li.parents) for i, parent in enumerate(soup.li.parents): print(i, parent)
兄弟节点
利用next_sibling和previous_sibling分别获取下一个和上一个兄弟元素,next_siblings和previous_siblings分别获取下一个和上一个兄弟元素生成器