Python Webscraping beautifulsoup 避免在 find_all()

我正在使用 Beautifulsoup 在 Python 中进行网络抓取。我正在尝试以粗体或斜体或两者提取文本。考虑以下 HTML 片段。


<div>

  <b> 

    <i>

      HelloWorld

   </i>

  </b>

</div>

如果我使用 command sp.find_all(['i', 'b']),可以理解,我会得到两个结果,一个对应于粗体,另一个对应于斜体。IE

['<b><i>HelloWorld</i></b>', '<i>HelloWorld</i>']

我的问题是,有没有办法唯一地提取它并获取标签?我想要的输出是这样的 -

标签:文本 - HelloWorld,标签名:[b,i]

请注意,比较文本并剔除文本的非唯一出现不是一个可行的选择,因为我可能在文本中重复了很多次“HelloWorld”,而我想将其提取出来。

谢谢!


隔江千里
浏览 75回答 2
2回答

元芳怎么了

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

婷婷同学_

我会说它没有明确定义。如果你有<b>foo<i>bar</i><b>(它可能更复杂)怎么办?无论如何,我会说你必须实现递归。这是一个例子:import bs4html = """<div>&nbsp; <b>&nbsp;&nbsp; &nbsp; <i>&nbsp; &nbsp; &nbsp; HelloWorld&nbsp; &nbsp;</i>&nbsp; </b></div>"""def recursive_find(soup):&nbsp; &nbsp; for child in soup.children:&nbsp; &nbsp; &nbsp; &nbsp; result = child.find_all(['i', 'b'], recursive=False)&nbsp; &nbsp; &nbsp; &nbsp; if result:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if len(result) == 1:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result_s_result = result[0].find_all(['i', 'b'], recursive=False)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if len(result_s_result) == 1:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print(result_s_result[0].contents)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print(result)&nbsp; &nbsp; &nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; recursive_find(child)oneline_html = "".join(line.strip() for line in html.split("\n"))soup = bs4.BeautifulSoup(oneline_html, 'html.parser')recursive_find(soup)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python