我希望得到<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>
答案 0 :(得分:100)
DOC中有一个超小部分,展示了如何查找/ find_all 直接孩子。
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)
答案 1 :(得分:89)
试试这个
li = soup.find('li', {'class': 'text'})
children = li.findChildren("a" , recursive=False)
for child in children:
print child
答案 2 :(得分:12)
试试这个:
li = soup.find("li", { "class" : "test" })
children = li.find_all("a") # returns a list of all <a> children of li
其他提醒:
find方法只获取第一个出现的子元素。 find_all方法获取所有后代元素并存储在列表中。
答案 3 :(得分:11)
也许你想做
soup.find("li", { "class" : "test" }).find('a')
答案 4 :(得分:6)
另一种方法 - 创建一个过滤函数,为所有需要的标签返回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
答案 5 :(得分:5)
“如何找到所有.block-marketing {
display: grid;
grid-template-columns: 1fr 1fr;
}
.marketing-image {
height: 100%;
img {
object-fit: cover;
width: 100%;
height: 100%;
}
}
.content {
padding: 50px;
background: pink;
}
a
的孩子而不是其他人的孩子?”
鉴于以下HTML(我添加了另一个<li class=test>
以显示select
和<a>
之间的差异):
select_one
解决方案是使用置于两个CSS选择器之间的child combinator(<div>
<li class="test">
<a>link1</a>
<ul>
<li>
<a>link2</a>
</li>
</ul>
<a>link3</a>
</li>
</div>
):
>
如果您只想找到第一个孩子:
>>> soup.select('li.test > a')
[<a>link1</a>, <a>link3</a>]
答案 6 :(得分:0)
刚刚遇到这个答案并检查了文档以查看 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