Beautiful Soup是Python的一个HTML或XML的解析库,可以用它来方便地从网页中提取数据。
-
<a>I love you</a>
<a>----</a>
是一个tag或者标签或者节点,a是tag_name或者标签名或者节点名 -
方法选择器
find_all()
和find()
:
find_all()
返回所有匹配的节点组成的列表;find()
返回匹配的第一个节点,非列表。 -
具体介绍
html_example:
<div>
<div>
<h4>Hello</h4>
</div>
<div>
<ul id="list-1">
<li>Foo</li>
<li>Bar</li>
<li>Jay</li>
</ul>
</div>
</div>
解读:
<ul id="list-1">------</ul> 节点/父节点, class属性的值是["list"], id属性的值是list-1
<li>Foo</li> 内部节点/子节点, class属性的值是["element"], Foo是该节点的text
<li>Bar</li> 内部节点/兄弟节点, class属性的值是["element"], Bar是该节点的text
ul和li:节点名
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_example, 'lxml')
print(soup.li.string)
print(soup.li["class"])
print(soup.ul["class"])
运行结果:
Foo # 获取第一个li节点的text
["element"] # 获取第一个li节点的class属性的值
["list"] # 获取第一个ul节点的class属性的值
find_all() 和 find() 可以传入name(节点名)、id、class、attrs参数
soup.find_all(name='ul') # 返回一整个大节点,列表只有一个元素
soup.find_all(id='list-1') # 返回一整个大节点,列表只有一个元素
soup.find_all(class_='element') # 返回三个内部节点,列表有三个元素;由于class在Python里是一个关键字,所以后面需要加一个下划线
soup.find_all(attrs={'id': 'list-1'}) # 返回一整个大节点,列表只有一个元素
print(soup.find_all(name='ul'))
运行结果:
<ul id="list-1">
<li>Foo</li>
<li>Bar</li>
<li>Jay</li>
</ul>
print(type(soup.find_all(class_='element')[0]))
运行结果:
class 'bs4.element.Tag' # 节点类型
attrs的返回结果是字典形式
print(soup.ul.attrs)
运行结果:
{'class': ['list'], 'id': 'list-1'} # 一个节点元素可能有多个class,所以返回的是列表
-
css选择器
select()
:
select('a b')
选择包含a的节点下包含b的节点,即选择包含b的节点,返回节点列表
select('a')
选择包含a的节点
a、b应为tag_name,例如ul、li -
可以使用lxml解析库和html.parser解析库
不同解析库返回的结果貌似是不同的,html.parser解析库返回结果更完整。
两者都是bs4模块自带的 -
Beautifulsoup 语法
import requests
from bs4 import BeautifulSoup
url = 'https://gs.caas.cn/xwzx/xwrd/382a73ce9a474836976650d14be58d38.htm'
response = requests.get(url)
# 使用BeautifulSoup解析页面内容
soup = BeautifulSoup(response.text, 'html.parser') # 使用response.text来获取服务器响应内容的文本形式,和3中的html文本是等同的