一、bs4
1、bs4获得标记的子集或父集或兄弟节点
(1)子集:
通过contents和children可以获得子集,前者获得的是字符串列表,后者获得的是一个列表迭代器对象,需要遍历获得内容
比如我们有以下代码和数据:
python">from bs4 import BeautifulSoup
html = """
<html><head><title>The Dormouse's story</title></head><body><p class="story">Once upon a time there were three little sisters; and their names were<a href="http://example.com/elsie" class="sister" id="link1"><span>Elsie</span></a><a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>and they lived at the bottom of a well.</p><p class="story">...</p>
"""
soup = BeautifulSoup(html,'lxml')
对于上述代码说明请参考主页上一篇文章
案例:
我们要获得p标签的子集:
python">print(soup.p.contents)
输出:
python">['\n Once upon a time there were three little sisters; and their names were\n ', <a class="sister" href="http://example.com/elsie" id="link1">
<span>Elsie</span>
</a>, '\n', <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, ' \n and\n
或:
python">soup.p.children
但是这种方法返回的是一个列表,我们需要对他进行迭代输出。示例:
python">children=soup.p.children
for i in children:print(i)
输出:
python"> Once upon a time there were three little sisters; and their names were<a class="sister" href="http://example.com/elsie" id="link1">
<span>Elsie</span>
</a><a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>and<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>and they lived at the bottom of a well.
(2)后代集
descendants获得后代集,返回的也是一个列表,操作与子集的children类似
案例:
python">for i,j in enumerate(soup.p.descendants):print(i,j)
(3)父集
parent,parents,前者获得a节点的父节点,获得一个直接父节点的全部内容。后者遍历所有父节点,返回一个列表。
parent案例:
获得a节点的父节点:
python">print(soup.a.parent)
parents案例:
获得a节点的所有父节点:
python">soup.a.parents
返回是一个列表,所以要对值操作也需要迭代,代码不再赘述。
(4)兄弟节点
next_sibling,previous_sibling。前者是获得下一个兄弟节点,后者是获得前一个兄弟节点。
next_siblings,previous_siblings。前者是获得当前节点的后面所有的兄弟节点,后者是获得当前节点的前面所有的兄弟节点,也是返回一个列表,操作值方式与上述迭代相同,代码不再赘述。
案例:
获取a标记的下一个兄弟节点
python">print(soup.a.next_sibling)
其他方法使用方法相同。
2、方法选择器
(1)方法
-
find() 和 find_all()
这两个方法都接受多个参数来指定搜索条件,比如标签名(
name
)、属性(attrs
)、文本内容(string
)等。find(name=None, attrs={}, recursive=True, string=None, **kwargs)
:返回文档中符合条件的第一个元素。find_all(name=None, attrs={}, recursive=True, string=None, limit=None, **kwargs)
:返回文档中所有符合条件的元素,并生成一个列表。
-
find_parent() 和 find_parents()
这两个方法用于向上遍历DOM树来查找父元素。
find_parent(name=None, attrs={}, string=None, limit=None, **kwargs)
:返回当前元素的第一个匹配父元素。find_parents(name=None, attrs={}, string=None, limit=None, recursive=True, **kwargs)
:返回当前元素的所有匹配父元素,并生成一个列表。
-
find_next() 和 find_next_siblings()
这两个方法用于查找当前元素之后的元素。
find_next(name=None, attrs={}, string=None, **kwargs)
:返回文档中当前元素之后的第一个匹配元素。find_next_siblings(name=None, attrs={}, string=None, limit=None, **kwargs)
:返回当前元素之后的所有匹配兄弟元素,并生成一个列表。
-
find_previous() 和 find_previous_siblings()
这两个方法用于查找当前元素之前的元素。
find_previous(name=None, attrs={}, string=None, **kwargs)
:返回文档中当前元素之前的第一个匹配元素。find_previous_siblings(name=None, attrs={}, string=None, limit=None, **kwargs)
:返回当前元素之前的所有匹配兄弟元素,并生成一个列表。
-
select()
select(selector, namespaces=None, limit=None, **kwargs)
:使用CSS选择器语法来查找元素,并返回一个列表。这是基于lxml的CSS选择器实现,提供了强大的选择能力。
(2)属性说明
find()
方法
- name:字符串或正则表达式,用于指定要查找的标签名。如果传递的是字符串,则会在文档中查找所有该名称的标签;如果传递的是正则表达式,则会查找所有匹配该正则表达式的标签名。
- attrs:字典,用于指定一个或多个属性及其值,作为查找条件。例如,
attrs={"class": "header"}
会查找所有class属性值为"header"的元素。 - recursive:布尔值,默认为True。如果为True,则Beautiful Soup会递归地通过文档的子孙节点来查找元素;如果为False,则只在当前节点的直接子节点中查找。
- string:字符串或正则表达式,用于指定要查找的文本内容。如果传递的是字符串,则会在文档中查找所有包含该文本的元素;如果传递的是正则表达式,则会查找所有文本内容匹配该正则表达式的元素。
- limit:这个参数实际上在
find()
方法中不常用,因为它主要用于find_all()
方法,以限制返回元素的数量。但在某些版本的Beautiful Soup中,如果传递了limit
参数给find()
,它可能会被忽略,因为find()
默认只返回第一个匹配的元素。 - kwargs:可以接受其他关键字参数,这些参数会作为属性来查找元素。例如,
id="link1"
可以直接作为find(id="link1")
来调用。
find_all()
方法
- name、attrs、recursive、string:这些参数的含义与
find()
方法相同,但find_all()
会返回所有匹配的元素,而不是仅仅第一个。 - limit:整数,用于限制返回元素的数量。如果文档中有超过
limit
个元素匹配给定的条件,则find_all()
只会返回前limit
个元素。