Python 在两个标签之间解析 HTML

1 投票
1 回答
899 浏览
提问于 2025-04-18 13:57

今天我在研究一个小文件上传器,结果从API页面得到了以下的回复。

upload_success<br>http://www.filepup.net/files/R6wVq1405781467.html<br>http://www.filepup.net/delete/Jp3q5w1405781467/R6wVq1405781467.html

我需要获取两个 <br> 标签之间的内容。我正在使用Beautifulsoup这个库,但我的代码返回的是None。

fpbs = BeautifulSoup(filepup.text)
finallink = fpbs.find('br', 'br')
print(finallink)

1 个回答

2

你不能在两个标签之间直接搜索文本,不可以。不过,你可以先找到第一个 <br> 标签,然后再找到它的 下一个兄弟节点

>>> soup = BeautifulSoup('upload_success<br>http://www.filepup.net/files/R6wVq1405781467.html<br>http://www.filepup.net/delete/Jp3q5w1405781467/R6wVq1405781467.html')
>>> soup.find('br')
<br/>
>>> soup.find('br').next_sibling
u'http://www.filepup.net/files/R6wVq1405781467.html'

你也可以使用 CSS选择器搜索,来查找一个 相邻的兄弟节点,然后再获取它的 前一个 兄弟节点。对于CSS来说,标签是兄弟节点,但在BeautifulSoup中,文本节点也算。

相邻选择器用 + 来连接两个CSS选择器,它会选择第二个。例如,br + br 会选择任何第二个出现的 br 标签。

如果再加上一个父节点(比如特定的id或class),这会是一个非常强大的组合:

>>> soup = BeautifulSoup('''\
... <div id="div1">
...     some text
...     <br/>
...     some target text
...     <br/>
...     foo bar
... </div>
... <div id="div2">
...     some more text
...     <br/>
...     select me, ooh, pick me!
...     <br/>
...     fooed the bar!
... </div>
... ''')
>>> soup.select('#div2 br + br')[0]
<br/>
>>> soup.select('#div2 br + br')[0].previous_sibling
u'\n    select me, ooh, pick me!\n    '

这样就能在特定的 <div> 标签中,精确地找到两个 <br> 标签之间的文本节点。

撰写回答