【问题标题】:Find HTML / XML node using RegEx使用 RegEx 查找 HTML / XML 节点
【发布时间】:2016-01-27 00:28:08
【问题描述】:

我正在解析许多 HTML 文档,并且在每个文档中都需要尝试提取一个英国邮政地址。为此,我使用 AngleSharp 解析 HTML,然后查找与我的 RegEx 匹配的 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 以获取地址的其余部分,因此我不只是想将 doc 视为字符串

【问题讨论】:

  • 您是否提前知道它将是“P”,或者您需要任何包含您的信息的纯文本内容节点(仅“P”示例页面github.com/AngleSharp/AngleSharp/wiki/Examples 提供了足够的详细信息)。
  • 我不知道地址将包含在哪个标签中 - 它可能是 P、DIV、DD 等

标签: c# anglesharp


【解决方案1】:

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

您可以使用诸如HTML Tidy 之类的实用程序库来“清理” html 并使其格式良好(如果还没有的话)。

【讨论】:

  • 与问题完全无关 - OP 已经使用 HtmlParser 来读取 HTML - 任何生成树的解析器都会遇到完全相同的问题。
  • 从 sn-p 显示他正在针对完整文档运行正则表达式。使用 XPath 会将它们直接带到包含它们需要解析的地址的元素。
  • 所以提供一个答案 - 到目前为止的帖子是半相关的评论。我看不出如何轻松地将 XPath 构建到未知节点(您似乎建议这样做,但我可能完全错了)。
  • 我事先不知道文档结构,甚至不知道邮政编码所在的标签,这就是我使用正则表达式的原因。得到结果后,我计划遍历 dom 以获取其余地址,因此我不只是想将 doc 视为字符串
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    我已经快速浏览了解析器的文档。如果您只想检查 &lt;p&gt; 标记中的文本,则需要执行以下操作。

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

    【讨论】:

    • 我不知道地址将包含在哪个标签中 - 它可能是 P、DIV、DD 等
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多