【问题标题】:how to discard only html tags and extracting the associated text in python如何仅丢弃html标签并在python中提取相关文本
【发布时间】:2020-04-29 05:18:54
【问题描述】:

我正在使用 lxml 提取与 html 标签关联的文本,但它也将 括号中的所有内容视为标签并将其丢弃。有什么方法可以保留文本中除标准 html 标签之外的所有内容吗?

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

这给出了输出

'(i)you'

但期望的输出是 &lt;Expe&gt;(i)you

我尝试了以下美丽汤:

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

这也丢弃了

'&lt;Expe&gt;'

在它的输出中。我在 中有很多不是 html 标签的文本。那么有没有办法不省略它们?

【问题讨论】:

    标签: python parsing beautifulsoup lxml


    【解决方案1】:

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

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

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

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

    suppress() 方法采用匹配文本并将其从解析的输出中抑制,transformString 处理应用每个解析表达式的完整输入。

    将您的示例字符串传递给它会得到与 BS text() 方法相同的输出:

    >>> 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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 2021-05-05
      相关资源
      最近更新 更多