c# - Html Agility Pack 无法使用 xpath 找到列表选项

标签 c# xpath html-agility-pack webdriver

这与 my previous question 有关,但我似乎还有另一个极端情况,其中 Html Agility Pack 无法按预期工作。

这是 Html(精简到最基本的部分,并删除了敏感信息):

<html>
<select id="one-time-payment-form:vendor-select-supplier">
    <option value="1848">Frarma Express</option>
    <option value="2119">Maderas Garcia</option>
    <option value="1974">Miaris, S.A.</option>
    <option value="3063">Ricoh Panama</option>
    <option value="3840">UNO EXPRESS</option>
    <option value="68">Garrett Blaser Gretsch</option>
    <option value="102">Oriel Antonio Grau</option>
</select>
</html>

代码如下:

const string xpath = "//*[contains(@id, 'one-time-payment-form:vendor-select-')]/option[contains(text(), 'UNO EXPRESS')]";
var driver = new FirefoxDriver(new FirefoxProfile()) { Url = "PATH_TO_FILE_CONTAINING_HTML_SHOWN_ABOVE" };
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 };
HtmlNode.ElementsFlags.Remove("form");
htmlDoc.LoadHtml(source);
var nodes = htmlDoc.DocumentNode.SelectNodes(xpath);
Console.WriteLine(nodes!=null ? "Html Agility Pack success" : "Html Agility Pack failure");

driver.Quit();

当我运行代码时,控制台显示:

WebDriver success
Html Agility Pack failure

很明显,WebDriver 可以毫无问题地定位项目 @XPath //*[contains(@id, 'one-time-payment-form:vendor-select-')]/option[contains(text() , 'UNO EXPRESS')],但 Html Agility Pack 不能。

有什么想法吗?

最佳答案

这是“设计使然”。 OPTION 和 FORM 的思路是一样的。由于 Html Agility Pack 的历史原因,某些标签的处理方式有所不同。回到 HTML 3.2 时代,OPTION 并不总是关闭的,而在 HTML 3.2 中,它不是必需的。

尝试添加这个:

HtmlNode.ElementsFlags.Remove("option");

关于c# - Html Agility Pack 无法使用 xpath 找到列表选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6230142/

相关文章:

ruby - 在 Nokogiri 中获取元素之间的数据

c# - 如何计算html文件C#中表格中的行数

c# - 计时器的字符串格式?

C# 和 XPath - 如何查询

javascript - 将属性插入 XSLT 工作表内的 javascript 时出现问题

html - 如何转义字符串中的特定 HTML 标记

c# - 使用 agility pack C# 处理 cookie 和 header

c# - 在 C# 的最后一个点上断开字符串的最佳方法

c# - 我可以将自定义属性限制为仅无效方法吗?

c# - Request.Url.UserInfo 无值