regex 使用正则表达式删除HTML实体并提取文本内容

jvidinwx  于 2023-08-08  发布在  其他
关注(0)|答案(4)|浏览(79)

我有一个文本只包含HTML实体,如< ,我需要删除这一切,只得到文本内容:

&nbspHello there<testdata>

字符串
所以,我需要从这一节得到Hello theretestdata。有没有什么方法可以使用负向前看来做到这一点?
我尝试了以下方法:/((?!&.+;).)+/ig但这似乎不太好用。那么,我如何从那里提取所需的文本呢?

bvjveswy

bvjveswy1#

查找HTML实体的更好语法是以下正则表达式:

/&([a-z0-9]+|#[0-9]{1,6}|#x[0-9a-fA-F]{1,6});/ig

字符串
此语法忽略假实体。

enxuqcxy

enxuqcxy2#

这里有两个建议:
1)使用/(&.+;)/ig匹配所有实体。然后,使用您正在使用的任何编程语言,将这些匹配替换为空字符串。例如,在php中使用preg_replace;在C#中使用Regex.Replace。有关更多情况的类似解决方案,请参见本SO:How to remove html special chars?
2)如果你真的想使用纯文本部分来实现这一点,你可以尝试这样做:/(?:^|;)([^&;]+)(?:&|$)/ig。它实际上试图做的是匹配;&之间的片段,其中包含没有实体的开始和结束的特殊情况。这可能不是正确的方法,你可能会遇到不同的情况。

cfh9epnr

cfh9epnr3#

它是特定于语言的,但在Python中可以使用html.unescapeMAN)。喜欢的:

import html
print(html.unescape("This string contains & and >"))
#prints: This string contains & and >

字符串

krugob8w

krugob8w4#

在简短地查看Python文档之后,可以看到html.parser模块:https://docs.python.org/3/library/html.parser.html#module-html.parser
在一些简短的原型设计之后,可以得到相当简单的代码:

from html.parser import HTMLParser

line_with_html = 'Data before tag with <span style="color:var(--md-font-color-green)">some gren text</span> with a nice logo'

class CleanHTML(HTMLParser):
    def reset(self) -> None:
        self.extracted_data = ""
        return super().reset()

    def remove_tags(self, html_data: str) -> str:
        """
        Args:
            html_data (str): HTML data which might contain tags.

        Returns:
            str: Data without any HTML tags. Forces feeding of any buffered data.
        """
        self.reset()
        self.feed(html_data)
        self.close()
        return self.extracted_data

    def handle_data(self, data: str) -> None:
        """
        Args:
            data (str): Html data extracted from tags to be processed.
        """
        self.extracted_data += data

p = CleanHTML()
print(p.remove_tags(line_with_html))

字符串
无需:

  • 使用正则表达式
  • 使用第三方模块,如BeautifulSoup
  • 使用不适用于HTML的解析器,如XML解析器

相关问题