好吧,您必须了解 XPATH 才能真正利用 HTML 敏捷包抓取功能 :-) 您可以 Google 上XPATH 示例 https://www.google.com/search?q=XPATH+examples首先。
关注屏幕抓取问题,棘手的部分是选择您认为对您想要获取的信息最具辨别力的 xpath 表达式。大多数时候,解决方案不仅只有一种,而且您必须准备好更新代码以适应目标站点 HTML 的演变。
因此,这是一种权衡,非常简单的表达式有可能匹配不需要的文本的风险,而过于有区别的表达式则不能容忍被抓取的 HTML 中的演变,有可能什么都不匹配的风险。
至于您的具体文本,这是一个很好的现实示例,下面是执行此操作的代码:
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(yourText);
string companyName = doc.DocumentNode.SelectSingleNode("/td/table/tr/td/table/tr/th").InnerText;
Console.WriteLine("company name=" + companyName);
// another way
companyName = doc.DocumentNode.SelectSingleNode("//td[@class='black']/table/tr/th").InnerText;
Console.WriteLine("company name=" + companyName);
// a more advanced XPATH expression, means
// "Select a TD tag anywhere in the doc that has a preceding sibling of TD type with a B chid, with a FONT child with inner text starting with 'Phone Number'"
string phoneNumber = doc.DocumentNode.SelectSingleNode("//td[starts-with(preceding-sibling::td/b/font/text(), 'Phone Number')]").InnerText;
Console.WriteLine("phone Number=" + phoneNumber);
// same kind of story but go down the next A tag
string email = doc.DocumentNode.SelectSingleNode("//td[starts-with(preceding-sibling::td/b/font/text(), 'E-mail')]/a").InnerText;
Console.WriteLine("email=" + email);
PS:请注意,HTML Agility Pack 始终期望 XPATH 表达式中使用的标签为小写,即使它们不在原始 HTML 文本中。
如您所见,此处使用两种不同的表达式检索公司名称。它们都适用于示例,但如果在中间的任何位置添加新标签,第一个将不会抵抗。第二个更面向未来,但基于 CSS 类标签,该标签也可能会发生变化。这总是一个权衡。
电话号码和电子邮件很相似,但显示了 XPATH 的强大功能。