带有get_text的beautifulsoup - 处理空格

时间:2016-07-21 15:52:36

标签: python python-3.x beautifulsoup

我使用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!”但它是“你好\ n世界!”。

我如何实现目标?

2 个答案:

答案 0 :(得分:1)

我认为:

得到后:

  • Hello World!
  • Hello \n World!

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

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

可以让你期待:

  • Hello World!
  • Hello World!

答案 1 :(得分:0)

问题是,get_text(strip=True)和加入.stripped_strings都不会在这里工作,因为在第二种情况下NavigableString元素中只有一个p,它的值是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!