【问题标题】:beautifulsoup with get_text - handle spaces带有 get_text 的 beautifulsoup - 处理空格
【发布时间】:2016-11-25 07:39:03
【问题描述】:

我使用 BS4 (python3) 从 html 文件中提取文本。我的文件如下所示:

<BODY>
<P>Hello         World!</P>
</BODY>
</HTML>

当我调用get_text() 方法时,输出为Hello World!。因为它是 HTML,所以预计我会得到 Hello World!(两个或多个空格在 HTML 中被替换为一个空格)。

这也与这种情况有关:

<BODY>
<P>Hello    
 World!</P>
</BODY>
</HTML>

预计我会找到“Hello World!”但它是“Hello \n World!”。

我怎样才能实现我的目标?

【问题讨论】:

  • 听起来你想要的是呈现 HTML 并获得结果文本输出。在某处(可能不在 BS 中)必须有一个函数来执行这种类型的转换。

标签: python python-3.x beautifulsoup


【解决方案1】:

问题是,get_text(strip=True) 和加入 .stripped_strings 都不会在这里工作,因为在第二种情况下,p 元素中有一个 NavigableString,它的值是 Hello\n World!。换句话说,换行符在文本节点内。

在这种情况下,您必须手动替换换行符

soup.p.get_text().replace("\n", "")

或者,要同时处理 br 元素(用换行符替换它们),您可以创建一个转换函数来为您准备文本:

from bs4 import BeautifulSoup, NavigableString

data = """
<BODY>

<P>Hello
 World!</P>

<P>Hello
<BR/>
 World!</P>

</BODY>
</HTML>
"""

def replace_with_newlines(element):
    text = ''
    for elem in element.children:
        if isinstance(elem, NavigableString):
            text += elem.replace("\n", "").strip()
        elif elem.name == 'br':
            text += '\n'
    return text

soup = BeautifulSoup(data, "html.parser")

for p in soup.find_all("p"):
    print(replace_with_newlines(p))

打印(第一种情况下没有换行符,第二种情况下只有一个换行符):

Hello World!
Hello
World!

【讨论】:

  • 不错的尝试,但这个解决方案是有限的。如果 HTML 中有“
    ”标签呢?在这种情况下应该打印“\n”... HTML 包含很多我想要支持的规则。
  • @No1Lives4Ever 好点,我明白。添加了更多信息。无论如何,寻找解决方法。谢谢。
  • @No1Lives4Ever 好的,请查看更新并在您的实际用例中进行测试。希望对您有所帮助。
【解决方案2】:

我认为:

得到后:

  • Hello World!
  • Hello \n World!

那么你应该使用re 来做这种工作:

re.sub("\s+", " ", htmlPValue)

可以达到你的预期:

  • Hello World!
  • Hello World!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 2019-12-20
    • 2014-03-26
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多