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

时间:2011-06-09 02:40:37

标签: python html 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>

7 个答案:

答案 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