我知道有关于此的帖子,但是在网络抓取方面,XPath似乎是我的弱点。即使我确信它是正确的,下面似乎也不起作用。
基本上我正在寻找一个包含文本“Pivot Point 2nd Level Resistance”并获取以下兄弟td值的td。什么地方出了错?
字符串RS2 = doc.DocumentNode.SelectSingleNode(“// td [contains(text(),'Pivot Point 第二级抵抗')] / follow-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&amp; amp; Selenium用于无头浏览器,它工作正常。这不是我想采取的路线,但问题已经找到。
答案 0 :(得分:1)
路径表达式中的步骤由/
分隔,因此您希望//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很好。
您可能需要编辑问题以告诉我们您获得了哪些结果,并尝试在尝试失败时添加最少但完整的输入和代码片段。
答案 1 :(得分:0)
在收到确认我的XPath是正确的之后,我继续用无头浏览器(Phantom Driver&amp; 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;