Beautiful Soup之方法选择器
**
- find_all()
**
API如下:
find_all(name, atters, recursive, text, **kwargs)
(1) name
根据节点来查询元素
html = '''
<div class="panel">
<div class="panel-heading">
<h4>Hello</h4>
</div>
<div class="panel-body">
<ul class="list" id="list-1">
<li class="element">Foo</li>
<li class="element">Bar</li>
<li class="element">Jay</li>
</ul>
<ul class="list-small" id="list-2">
<li class="element">Foo</li>
<li class="element">Bar</li>
</ul>
</div>
</div>'''
from bs4 import BeautifulSoup
# 创建解析对象
soup = BeautifulSoup(html, 'lxml')
# 查找所有ul节点
print(soup.find_all(name='ul'))
# 查找所有ul节点内部中的li节点
for ul in soup.find_all(name='ul'):
print(ul.find_all(name='li'))
# 查找所有li节点中的文本
for li in ul.find_all(name='li'):
print(li.string)
(2) attrs
传入一些属性查询。
html = '''
<div class="panel">
<div class="panel-heading">
<h4>Hello</h4>
</div>
<div class="panel-body">
<ul class="list" id="list-1" name="elements">
<li class="element">Foo</li>
<li class="element">Bar</li>
<li class="element">Jay</li>
</ul>
<ul class="list-small" id="list-2">
<li class="element">Foo</li>
<li class="element">Bar</li>
</ul>
</div>
</div>'''
from bs4 import BeautifulSoup
# 创建解析对象
soup = BeautifulSoup(html, 'lxml')
# 输出id为list-1的节点
print(soup.find_all(attrs={
'id': 'list-1'}))
# 输出name为elements的节点
print(soup.find_all(attrs={
'name': 'elements'}))
这里查询的时候传入的参数为attrs,参数的类型是字典。比如要查询id为list-1的节点,可以传入
attrs={‘id’: ‘list-1’}的查询条件,得到的结果是列表类型。
然而,对于一些常用的属性,可以不用attrs来传递。可以直接传入id='list-1’这样的查询条件。
但是,查询条件为class时,需要将class=‘element’ 改为 class_=‘element’。因为class是python中的关键字。
(3) text
text参数可以用来匹配节点的文本,传入的形式可以是字符串,可以是正则表达式对象。
html_1 = '''
<div class="panel">
<div class="panel-body">
<a>Hello, This is Chen Jiahe's blog!</a>
<a>Welcome to pay attention to me!</a>
</div>
</div>
'''
bs = BeautifulSoup(html_1, 'lxml')
# compile可以将正则字符串编译成正则表达式对象
print(bs.find_all(text=re.compile('Chen')))
html_1中有两个a节点,其中都包含文本内容。这里使用find_all方法,传入text参数,该参数为正则表达式对象,再使用re.compile()将正则字符串编译成正则表达式对象。结果为所有匹配正则表达式的节点文本组成的列表。
- find()
find_all()方法是返回所有匹配的元素组成的列表,而find()方法则是返回第一个匹配的元素。
html = '''
<div class="panel">
<div class="panel-heading">
<h4>Hello</h4>
</div>
<div class="panel-body">
<ul class="list" id="list-1" name="elements">
<li class="element">Foo</li>
<li class="element">Bar</li>
<li class="element">Jay</li>
</ul>
<ul class="list-small" id="list-2">
<li class="element">Foo</li>
<li class="element">Bar</li>
</ul>
</div>
</div>
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.find(name='ul'))
上面的html中有两个ul节点,这里使用了find()方法查找ul节点,而find()方法匹配的是第一个元素,因此输出的是第一个ul节点中的内容。返回结果不再是列表,而是单个节点元素。
- 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(): 前者为返回节点前的所有符合条件的节点,后者为返回节点前第一个符合条件的节点。