我使用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世界!”。
我如何实现目标?
答案 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!