2 回答

TA贡献1798条经验 获得超7个赞
XPath是查找同时具有它们的祖先的节点的最自然的<b>
方法<i>
:
//node()[ancestor::i or ancestor::b]
node()
您可以根据情况使用text()
查找文本节点或*
查找元素来代替。这不会选择任何重复项,也不关心以什么顺序<i>
嵌套<b>
。
这个想法的问题是 BeautifulSoup 不支持 XPath。出于这个原因,我会使用 lxml 而不是 BeautifulSoup进行网络抓取。

TA贡献1844条经验 获得超8个赞
我会说它没有明确定义。如果你有<b>foo<i>bar</i><b>(它可能更复杂)怎么办?
无论如何,我会说你必须实现递归。
这是一个例子:
import bs4
html = """
<div>
<b>
<i>
HelloWorld
</i>
</b>
</div>
"""
def recursive_find(soup):
for child in soup.children:
result = child.find_all(['i', 'b'], recursive=False)
if result:
if len(result) == 1:
result_s_result = result[0].find_all(['i', 'b'], recursive=False)
if len(result_s_result) == 1:
print(result_s_result[0].contents)
else:
print(result)
else:
recursive_find(child)
oneline_html = "".join(line.strip() for line in html.split("\n"))
soup = bs4.BeautifulSoup(oneline_html, 'html.parser')
recursive_find(soup)
添加回答
举报