【问题标题】:BeautifulSoup - Extract text with tags as textBeautifulSoup - 提取带有标签的文本作为文本
【发布时间】:2017-02-16 05:50:06
【问题描述】:

假设我有 html

<div>Hey</div><div>This is <b>some text<b/>, right here. <a>Link<a/></div>

和代码

soup = BeautifulSoup(html)
texts = soup.findAll(text=True)

print() 将返回

['Hey', 'This is ', 'some text', ', right here.', 'Link']

文本。

我怎样才能排除像'b'这样的标签(只包含文本),所以我可以获得所需的输出

['Hey', 'This is <b>some text<b/>, right here.', 'Link']

最好也不是字符串,而是等效的 NavigableStrings 或类似的。

换句话说,我怎样才能从导航树中排除一些标签?

【问题讨论】:

  • 你的意思是什么我怎么能排除像'b'这样的标签(只包含文本),你认为像b这样的其他标签是什么?
  • 只有 'i' 可能还有 br,尽管我的 html 只包含 b。我基本上想分别从标签中提取所有文本资源,除了我想提取父级文本的“b”之外,不包括其他兄弟标签中的任何文本。
  • 你能添加一个更复杂的例子以及你想要的输出吗?
  • 肯定的。我更新了问题。希望它足够复杂。假设 b 没有嵌套标签(即“仅文本”)。

标签: python beautifulsoup


【解决方案1】:

基于更新的 OP 的问题:

eDiv = soup.findAll("div")
if eDiv.find("b") is None:
    tag = eDiv.text
else:
    tag = eDiv

现在您可以将其附加到列表中。

【讨论】:

  • 将适用于我的示例,但在我的实际 html 上需要不同的方法。一些 div 包含我想单独提取文本的其他元素。我的 html 更大,我无法手动挑选元素。一些包含文本的标签是 h1、h2、p、li、a 等...和 ​​div,但有些 div 内部还有其他元素。
  • 必须有一些你感兴趣的div的唯一标识符,然后你可以使用CSS选择器(使用soup.select)来获取它们。如果您在此处提供大量 html,我可能会尝试为您获取该唯一标识符。
  • eDiv = soup.findAll("div") if eDiv.find("b") is None: tag = eDiv.text else: tag = eDiv 现在您可以将其附加到列表中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-21
  • 2014-06-16
  • 2023-04-02
  • 2015-10-22
  • 2017-05-25
  • 1970-01-01
相关资源
最近更新 更多