我正在使用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 标记的anyOpenTag
和anyCloseTag
表达式。
一个简单的标签剥离器可以写成:
>>> 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'