使用beautifulsoup提取特定标签后面的所有链接



我找不到关于SO的具体问题的答案,所以就这样吧。假设我有一个看起来像这样的HTML(抱歉,如果它看起来有点愚蠢,我只是想做一个非常简单的例子来捕捉我的问题):

html1 = """<html>
<head></head>
<body>
<p>Hello World!</p>
<a href='whatevs.com'>whatevs</a>
<p>Howdy!</p>
<a href='well.com'>well</a>
<div><span>haha</span><a href='haha.com'>haha</a></div>
<a href='goodbye.com'>Goodbye!</a>
</body>
</html>"""

我想提取<p>Howdy!</p>之后的所有链接。

So I try,

howdy = BeautifulSoup(html1).find('p', text='Howdy!')

howdy.find_next_siblings('a')howdy.find_next('a')返回的东西与我想要的有点不同。

所需输出:

[<a href="well.com">well</a>,
<a href="haha.com">haha</a>,
<a href="goodbye.com">Goodbye!</a>]

(实际上,它是['well','haha','Goodbye!'],但我想我可以从上面得到这个。)

理想情况下,我想要howdy.find_all('a')

如果这是一个太基本的问题,我很抱歉,但如果有人能给我指明正确的方向,我真的很感激。谢谢!

尝试:

from bs4 import BeautifulSoup
html1 = """<html>
<head></head>
<body>
<p>Hello World!</p>
<a href='whatevs.com'>whatevs</a>
<p>Howdy!</p>
<a href='well.com'>well</a>
<div><span>haha</span><a href='haha.com'>haha</a></div>
<a href='goodbye.com'>Goodbye!</a>
</body>
</html>"""
soup = BeautifulSoup(html1, "html.parser")
out, tag = [], soup.find("p", text="Howdy!")
while True:
tag = tag.find_next("a")
if not tag:
break
out.append(tag.text)
print(out)

打印:

['well', 'haha', 'Goodbye!']

.find_next_siblings()是你要找的:

from bs4 import BeautifulSoup
html1 = """<html>
<head></head>
<body>
<p>Hello World!</p>
<a href='whatevs.com'>whatevs</a>
<p>Howdy!</p>
<a href='well.com'>well</a>
<div><span>haha</span><a href='haha.com'>haha</a></div>
<a href='goodbye.com'>Goodbye!</a>
</body>
</html>"""
soup = BeautifulSoup(html1, 'lxml')
siblings = soup.find('p', text="Howdy!").find_next_siblings()
a_tags = [sib.find('a').text if sib.name != 'a' else sib.text for sib in siblings]
# -> ['well', 'haha', 'Goodbye!']

注意:使用.find_next_siblings('a')不会得到期望的结果,因为它不查找内部标签。

最新更新