如何在 Python 中仅丢弃 HTML 标签并提取关联的文本



我正在使用lxml来提取与html标签相关的文本,但它也将<>括号中的所有内容视为标签并丢弃它。有没有办法在文本中保留除标准 html 标签以外的所有内容?

from lxml import html
data="<EXPE>(i)<i>you</i>"
print(html.fragment_fromstring(data).text_content())

这给出了输出

'(i)you'

但所需的输出将是<Expe>(i)you

我尝试了与美丽汤相同的方法,如下所示:

from bs4 import BeautifulSoup
soup = BeautifulSoup(data, 'html.parser')
text = soup.find_all(text=True)
print(text)

这也丢弃了

'<Expe>'

在其输出中。我里面有很多文本<>这些文本不是html标签。那么有没有办法不省略它们呢?

当您不想构建完整的文档模型时,Pyparsing 可以处理 XML 或 HTML 标记,而只是在这里和那里进行文本提取或操作。

Pyparsing 包括一个用于定义标记匹配表达式的makeHTMLTags方法,以及将匹配任何 XML 或 HTML 标记的anyOpenTaganyCloseTag表达式。

一个简单的标签剥离器可以写成:

>>> import pyparsing as pp
>>> anyHtml = pp.anyOpenTag | pp.anyCloseTag
>>> anyHtml.suppress().transformString(data)

suppress()方法采用匹配的文本并从分析的输出中禁止显示它,transformString处理应用每个分析表达式的完整输入。

将示例字符串传递给它,将给出与 BStext()方法相同的输出:

>>> anyHtml.suppress().transformString(data)
'(i)you'

但是您可以修改此剥离器以跳过要保留的任何标签,方法是首先检查并用"~"(pp.NotAny的快捷方式运算符(否定它们。定义一个解析表达式,用于描述您不希望剥离的所有标记。

>>> keepers = pp.MatchFirst(pp.makeHTMLTags(keeper)[0] for keeper in "EXPE SAVE OTHER".split())

然后将其用作否定检查,以避免匹配您想要保留的标签:

>>> (~keepers + anyHtml).suppress().transformString(data)
'<EXPE>(i)you'

最新更新