[英]XPATH using contains and following-sibling
我知道有很多关于此的文章,但是在涉及Web抓取时,XPath似乎是我的弱点。 即使我确信它是正确的,以下内容似乎也不起作用。
基本上,我正在寻找包含文本“枢轴点第二级阻力”的td,并采用以下同级td值。 什么地方出了错?
字符串RS2 = doc.DocumentNode.SelectSingleNode(“ // td [contains(text(),'Pivot Point 2nd Level Resistance'']] / following-sibling :: td [1]”)。InnerText
以下是我要抓取的内容:
<tr data-ng-repeat="point in cheatSheetData | filter:categoryFilter" data-ng-class="point.class" class="high support-resistance"> <td class="label support-resistance highlight" data-ng-class="{'highlight': point.labelSupportResistance}"> Pivot Point 2nd Level Resistance </td> <td class="value"> 9.43 </td> <td class="label pivot-points" data-ng-class="{'highlight': point.labelTurningPoints}"> </td> </tr>
编辑:事实之后,我尝试抓取的网站数据似乎已更改为加载,因此在我抓取期间节点不可用。 我通过为无头浏览器设置Phantom&Selenium的方法进行了测试,并且效果很好。 这不是我要走的路线,但已发现问题。
路径表达式中的步骤由/
分隔,因此您希望//td[contains(text(),'Pivot Point 2nd Level Resistance')]/following-sibling::td[1]
在语法上有意义。 我将放弃text()
并使用//td[contains(. ,'Pivot Point 2nd Level Resistance')]/following-sibling::td[1]
。
当我尝试使用HTMLAgilityPack的最新NuGet包和代码编写.NET 4.6.1控制台程序时
string html = @"<html><body><table><tr data-ng-repeat=""point in cheatSheetData | filter:categoryFilter"" data-ng-class=""point.class"" class=""high support-resistance"">
<td class=""label support-resistance highlight"" data-ng-class=""{'highlight': point.labelSupportResistance}"">
Pivot Point 2nd Level Resistance
</td>
<td class=""value"">
9.43
</td>
<td class=""label pivot-points"" data-ng-class=""{'highlight': point.labelTurningPoints}"">
</td>
</tr></table></body></html>";
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
string RS2 = doc.DocumentNode.SelectSingleNode("//td[contains(text(),'Pivot Point 2nd Level Resistance')]/following-sibling::td[1]").InnerText;
Console.WriteLine(RS2);
它输出
9.43
因此基于XPath很好。
您可能需要编辑问题以告诉我们您获得了什么结果,并尝试在尝试失败的地方添加最少但完整的输入和代码片段。
在确认XPath正确无误后,我继续使用无头浏览器(Phantom Driver&Selenium)测试了我的代码,XPath现在返回一个值。 似乎网站已更改,现在尚未生成节点。 不是我要走的路,但是发现了问题。
如果有人感兴趣,这是我的完整代码:
IWebDriver driver = new PhantomJSDriver();
driver.Navigate().GoToUrl(Url);
string RS2 = driver.FindElement(By.XPath("//td[contains(.,'Pivot Point 2nd Level Resistance')]/following-sibling::td[1]")).Text;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.