Python Beautifulsoup
程序员文章站
2022-05-02 17:39:46
...
简介
简单来说,Beautiful Soup 是python的一个库,最主要的功能是从网页抓取数据。
官方解释如下:
Beautiful Soup 提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。Beautiful Soup 自动将输入文档转换为Unicode 编码,输出文档转换为 utf-8 编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup 就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。Beautiful Soup 已成为和lxml、html6lib 一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。
安装
pip install beautifulsoup4
使用
from bs4 import BeautifulSoup
soup = BeautifulSoup(markup,'html.parser')
print soup.prettify() # 格式化输出
四大对象种类
Beautiful Soup 将复杂的html文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4中:
- Tag
- NavigableString
- BeautifulSoup
- Comment
# Tag 举例
soup.title
soup.head
soup.a
soup.p
soup.p.attrs # 属性
soup.p['class'] # 属性值
soup.p['class'] # 属性值
# NavigableString ,获取标签内部的文字
soup.p.string
搜索文档树
find_all(name,attrs,recursive,text,**kwargs)
搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件
1)name参数
A.传字符串
tag.find_all('title',class_='sister') # 搜索标签为title, 属性class='sister'的tag ,为防止class跟关键词重名,所以加一个下划线
B.传正则表达式
soup.find_all(re.compile("^b"))
C. 传列表
soup.find_all(["a","b"])
D. 传True
soup.find_all(True) # True可以匹配任何值,查找到所有的tag,不会返回字符串节点
E. 传方法
def has_class_but_no_id(tag):
return tag.has_attr('class') and not tag.has_attr('id')
soup.find_all(has_class_but_no_id) # 将方法作为参数传入
2) keyword 参数
soup.find_all(id='link2')
soup.find_all(href=re.compile('elsie'))
soup.find_all(href=re.compile('elsie'),id='link1') # 多个指定名字的参数可以同时过滤tag的多个属性
soup.find_all(attrs={'data-foo':'value'}) #有些tag属性在搜索中不能使用,比如 data-*属性,但是可以通过attrs参数定义一个字典参数来搜索包含特殊属性的tag
3)text 参数
通过text参数可以搜索文档中的字符串内容。与那么参数的可选值一样,text参数接受字符串、正则表达式、列表、True
soup.find_all(text='jim')
soup.find_all(text=['tillie','elsie','jim'])
soup.find_all(text=re.compile('jim'))
4) limit参数
限制返回结果的数量
soup.find_all('a',limit=2)
5) recursive 参数
调用tag的find_all() 方法时,Beautiful Soup 会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 recursive=False 。
soup.find_all('title',recursive=False)
CSS 选择器
在写CSS时,标签名不加任何修饰,类名前加点,id名前加#
这里用到的方法是 soup.select(), 返回类型是 list
1) 通过标签名查找
soup.select('title')
2) 通过类名查找
soup.select('.sister')
3) 通过id名查找
soup.select('#link1')
4) 组合查找
soup.select('p #link1')
5) 属性查找
soup.select('a[class="sister"']')
6) 通过 get_text() 方法获取内容
soup.select()[0].get_text()