使用 RegEx 查找 HTML / XML 节点

本文关键字:XML 节点 HTML RegEx 查找 使用 | 更新日期: 2023-09-27 18:31:57

我正在解析许多HTML文档,并且每个文档都需要尝试提取英国邮政地址。 为了做到这一点,我正在使用AngleSharp解析HTML,然后寻找与我的正则表达式匹配的TextContent节点:

var parser = new HtmlParser();
var source =  "<html><head><title>Test Title</title></head><body><h1>Some example source</h1><p>This is a paragraph element and example postode EC1A 4NP</body></html>";
var document = parser.Parse(source);
Regex searchTerm = new Regex("([A-PR-UWYZ][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)");
var list = document.All.Where(m => searchTerm.IsMatch((m.TextContent ?? "").ToUpper()));

这将返回 3 个结果,即 htmlbodyp 元素。 我唯一要返回的元素是 p 元素,因为它的 innerText 与正则表达式正确匹配。 一个页面上也可能有多个匹配项,所以我不能只返回最后一个结果。 我希望只返回该元素中的文本(不在任何子节点中)与正则表达式匹配的任何元素。

编辑

事先不知道文档结构,甚至不知道邮政编码所在的标签,这就是我使用正则表达式的原因。一旦我得到结果,我计划遍历 dom 以获取地址的其余部分,所以我不只是想将文档视为字符串

使用 RegEx 查找 HTML / XML 节点

如果您希望在格式良好的 HTML/XML 文档中提取特定节点,那么请查看使用 XPath。MSDN上有一些示例

您可以使用实用程序库(如 HTML Tidy)来"清理"html,并使其格式良好(如果尚未形成)。

好吧,我最终采取了不同的方法。 我将 HTML 文档作为字符串搜索,使用正则表达式不是为了解析 HTML,而只是为了找到确切的匹配值。 一旦我有了这个值,就很简单了,使用 xpath 表达式来返回节点。 在上面的示例中,正则表达式搜索返回 EC1A 4NP 和以下 XPATH:

//*[contains(text(),'EC1A 4NP')]

返回所需的节点。 为了方便XPath,我从AngleSharp切换到HtmlAgilityPack进行HTML解析。

我已经快速浏览了解析器的doco。如果您只想检查<p>标签中的文本,则需要执行以下操作。

var list = document.All.Where(m => m.LocalName.ToUpper() == "P" && searchTerm.IsMatch((m.TextContent ?? "").ToUpper()));