欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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中:

  1. Tag
  2. NavigableString
  3. BeautifulSoup
  4. 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()
相关标签: Beautifulsoup bs4