最近在搞页面的信息获取,之前一直用xpath,结果公司的源码里面用的是beautifulSoup
,因此今天拿来学习一下
安装
pip install beautifulsoup4
使用方法
-
主要分为三种方法
- 节点选择器
- 方法选择器
- CSS选择器
-
使用建议:
优先使用方法选择器、其次是CSS选择器,最后是节点选择器
样例
from bs4 import BeautifulSoup
text = '''
<html><head><title>there is money</title></head>
<body>
<p class="title" name="dmr"><b>there is money</b></p>
<p class="money">good good study, day day up
<a href="https://www.baidu.com/1" class="error" id="l1"><span><!-- 1 --></span></a>,
<a href="https://www.baidu.com/2" class="error" id="l2"><span>2</span></a> and
<a href="https://www.baidu.com/3" class="error" id="l3">3</a>;
66666666666
</p>
<p class='body'>...</p>
'''
# 实例化soup对象
soup = BeautifulSoup(text, 'lxml')
# 节点选择器
print(soup.title, type(soup.title))
# 提取节点里面的文本内容
print(soup.title.string)
# 提取p标签的属性
print(soup.p.attrs)
# 获取p标签的class的属性值, 一个class可能会有多种属性,因此class属性被封装成列表
print(soup.p.attrs.get('class'))
# 嵌套
# 下面的例子为:获取第二个p标签下的子节点
# 思路:先找到所有的p标签,找到指定的p标签,.children找出其对应的子节点
print(list(soup.find_all('p')[1].children))
# 寻找一个节点的父节点
print(soup.a.parent)
print(soup.a.parents) # 返回一个迭代器,建议使用
for i in soup.a.parents:
print(i)
# 寻找兄弟节点
print(soup.a.next_siblings) # 返回迭代器,里面是与a标签关联的兄弟节点,但是如果有字符串的话,也会被认为是兄弟节点
for i in soup.a.next_siblings:
print(i, type(i))
print(soup.a.previous_sibling) # 注意属性结尾没有s,只返回一个结果。就是a标签的上一个兄弟节点
print(soup.a.previous_siblings, type(soup.a.previous_siblings))
for i in soup.a.previous_siblings:
print(i)
# 方法选择器
# find_all方法,查询所有符合条件的,返回一个列表,元素类型为tag
# find方法,查询符合条件的第一个元素,返回一个tag类型对象
# 同理,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
print(soup.find_all("a", attrs={"id": "l2"})) # 如果使用这种方法去找标签,可以通过attrs这个参数指定想找标签的属性
# CSS选择器 关键字:select
print(soup.select("p a")) # 标签选择器
print(soup.select(".error")) # 类选择器
print(soup.select("a")[2].get_text())