我在使用 Html Agility Pack 时不断遇到问题;我的 XPath 查询仅在极其简单时才有效:
//*[@id='some_id']
or
//input
然而,当它们变得更加复杂时,Html Agility Pack 就无法处理它。
下面是一个演示该问题的示例,我使用 WebDriver 导航到 Google,并返回页面源,该页面源被传递给 Html Agility Pack,并且 WebDriver 和 HtmlAgilityPack 都尝试定位元素/节点 (C#):
//The XPath query
const string xpath = "//form//tr[1]/td[1]//input[@name='q']";
//Navigate to Google and get page source
var driver = new FirefoxDriver(new FirefoxProfile()) { Url = "http://www.google.com" };
Thread.Sleep(2000);
//Can WebDriver find it?
var e = driver.FindElementByXPath(xpath);
Console.WriteLine(e!=null ? "Webdriver success" : "Webdriver failure");
//Can Html Agility Pack find it?
var source = driver.PageSource;
var htmlDoc = new HtmlDocument { OptionFixNestedTags = true };
htmlDoc.LoadHtml(source);
var nodes = htmlDoc.DocumentNode.SelectNodes(xpath);
Console.WriteLine(nodes!=null ? "Html Agility Pack success" : "Html Agility Pack failure");
driver.Quit();
在本例中,WebDriver 成功找到了该项目,但 Html Agility Pack 却没有找到。
我知道,我知道,在这种情况下,将 xpath 更改为可用的路径非常容易://输入[@name='q'],但这只会解决这个特定的例子,这不是重点,我需要一些东西exactly或者至少closely镜像 WebDriver 的 xpath 引擎的行为,甚至是 Firefox 的 FirePath 或 FireFinder 插件的行为。
如果 WebDriver 找不到它,那么为什么 Htmlagilitypack 也找不到它?
您遇到的问题与 FORM 元素有关。 HTML 敏捷包以不同方式处理该元素- 默认情况下,它永远不会报告它有孩子。
在您给出的特定示例中,此查询确实找到了目标元素:
.//div/div[2]/table/tr/td/table/tr/td/div/table/tr/td/div/div[2]/input
然而,事实并非如此,所以很明显表单元素正在困扰解析器:
.//form/div/div[2]/table/tr/td/table/tr/td/div/table/tr/td/div/div[2]/input
不过,这种行为是可配置的。如果您在解析 HTML 之前放置此行,则表单将为您提供子节点:
HtmlNode.ElementsFlags.Remove("form");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)