我正在解析许多HTML文档,并在每个需要尝试提取英国邮政地址。为了做到这一点,我使用AngleSharp解析HTML,然后查找TextContent与我的RegEx匹配的节点:
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个结果,html
,body
和p
元素。我想要返回的唯一元素是p元素,因为innerText正确匹配正则表达式。页面上可能还有多个匹配项,因此我无法返回最后一个结果。我希望只返回该元素中的文本(不在任何子节点中)与正则表达式匹配的任何元素。
修改
我事先并不知道文档结构甚至是邮政编码所在的标记,这也是我使用正则表达式的原因。一旦我得到了结果,我计划遍历dom以获取地址的其余部分,因此我不想将文档视为字符串
答案 0 :(得分:0)
如果您希望在格式良好的HTML / XML文档中提取特定节点,那么请查看如何使用XPath。 MSDN
上有一些例子您可以使用HTML Tidy等实用程序库来“清理”html,并使其形成良好(如果尚未完成)。
答案 1 :(得分:0)
我已经快速浏览了解析器的doco。如果您只想检查CoGroupByKey
标记中的文字,则需要执行以下操作。
<p>
答案 2 :(得分:0)
好的,我最后采取了不同的方法。我使用RegEx NOT将HTML文档搜索为字符串,以解析HTML,但只是找到完全匹配的值。一旦我有了这个值,就可以使用xpath表达式来返回节点。在上面的示例中,正则表达式搜索返回EC1A 4NP和以下XPATH:
//*[contains(text(),'EC1A 4NP')]
返回所需的节点。为了便于XPath,我从AngleSharp切换到HtmlAgilityPack进行HTML解析