如何使用 BeautifulSoup 查找节点的子节点

我想得到所有的 <a>标签,这是 <li>的孩子:

<div>
<li class="test">
<a>link1</a>
<ul>
<li>
<a>link2</a>
</li>
</ul>
</li>
</div>

我知道如何找到具有如下特定类的元素:

soup.find("li", { "class" : "test" })

但是我不知道如何找到所有的 <a>,它们是 <li class=test>的孩子,而不是任何其他的孩子。

就像我想选择的:

<a>link1</a>
293526 次浏览

也许你想做

soup.find("li", { "class" : "test" }).find('a')

试试这个

li = soup.find('li', {'class': 'text'})
children = li.findChildren("a" , recursive=False)
for child in children:
print(child)

还有一种方法——创建一个过滤器函数,它为所有需要的标记返回 True:

def my_filter(tag):
return (tag.name == 'a' and
tag.parent.name == 'li' and
'test' in tag.parent['class'])

然后打电话给 find_all,告诉他参数:

for a in soup(my_filter): # or soup.find_all(my_filter)
print a

DOC 中有一个超小的部分展示了如何查找/查找所有 直接子节点。

Https://www.crummy.com/software/beautifulsoup/bs4/doc/#the-recursive-argument

在你的例子中,如果你想要 link1,它是第一个直接子元素:

# for only first direct child
soup.find("li", { "class" : "test" }).find("a", recursive=False)

如果你想要所有的直系子女:

# for all direct children
soup.find("li", { "class" : "test" }).findAll("a", recursive=False)

试试这个:

li = soup.find("li", { "class" : "test" })
children = li.find_all("a") # returns a list of all <a> children of li

其他提示:

Find 方法只获取第一个出现的子元素。 Find _ all 方法获取所有子元素并存储在一个列表中。

“如何找到所有的 a,这是儿童的 <li class=test>,但没有任何其他?”

给定下面的 HTML (我添加了另一个 <a>来显示 selectselect_one之间的 te 差异) :

<div>
<li class="test">
<a>link1</a>
<ul>
<li>
<a>link2</a>
</li>
</ul>
<a>link3</a>
</li>
</div>

解决方案是使用位于两个 CSS 选择器之间的 子组合程序(>) :

>>> soup.select('li.test > a')
[<a>link1</a>, <a>link3</a>]

如果你只想找到第一个孩子:

>>> soup.select_one('li.test > a')
<a>link1</a>

只是偶然发现了这个答案,并检查了文档,看看 soup.findChildren是否已被弃用(BS 4.9)。可以改用 soup.children,它只考虑元素的直接子元素,而不考虑它的子元素。

li = soup.find('li', {'class': 'text'})
for child in li.children:
print(child)

文件: https://www.crummy.com/software/BeautifulSoup/bs4/doc/#contents-and-children