我找不到关于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')
不会得到期望的结果,因为它不查找内部标签。