在这个SO问题的帮助下,我有一个几乎工作的xpath:
//div[contains(@class, 'measure-tab') and contains(., 'someText')]
Run Code Online (Sandbox Code Playgroud)
然而,这有两个divs:一个是孩子td有一些文本,另一个是孩子span.
如何将其缩小到与span?
<div class="measure-tab">
<!-- table html omitted -->
<td> someText</td>
</div>
<div class="measure-tab"> <-- I want to select this div (and use contains @class)
<div>
<span> someText</span> <-- that contains a deeply nested span with this text
</div>
</div>
Run Code Online (Sandbox Code Playgroud) 我正在用C#编写简单的屏幕抓取程序,为此我需要选择所有输入放在一个名为"aspnetForm"的表单中(页面上有2个表单,我不希望输入来自另一个),以及此表单中的所有输入都放在不同的表格,div中,或者只放在此表单的第一个子级别.
所以我写了非常简单的XPath查询:
//form[@id='aspnetForm']//input
Run Code Online (Sandbox Code Playgroud)
它在我测试的所有浏览器(Chrome,IE,Firefox)中按预期工作 - 它返回我想要的内容.
但是在HTMLAgilityPack中根本不起作用 - SelectNodes总是返回NULL.
我为测试编写的查询工作正常,但不返回我想要的.首先选择作为我的表单的第一个孩子的所有输入,然后选择返回的表单:
//form[@id='aspnetForm']/input
//form[@id='aspnetForm']
Run Code Online (Sandbox Code Playgroud)
是的,我知道我可以枚举上次查询的节点,或者在其结果上创建另一个SelectNodes,但我真的不想这样做.我想在浏览器中使用相同的查询.
XPath目前在HTMLAgilityPack中被破坏了吗?C#有任何替代的XPath实现吗?
更新:测试代码:
using HtmlAgilityPack;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace HtmlAGPTests
{
[TestClass]
public class XPathTests
{
private const string html =
"<form id=\"aspnetForm\">" +
"<input name=\"first\" value=\"first\" />" +
"<div>" +
"<input name=\"second\" value=\"second\" />" +
"</div>" +
"</form>";
private static HtmlNode GetHtmlDocumentNode()
{
var document = new HtmlDocument();
document.LoadHtml(html);
return document.DocumentNode;
}
[TestMethod]
public void TwoLevelXpathTest() // fail - nodes is NULL actually.
{
var query = …Run Code Online (Sandbox Code Playgroud)