XPATH使用包含和跟随兄弟

时间:2017-11-05 16:31:20

标签: html xpath

我知道有关于此的帖子,但是在网络抓取方面,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用于无头浏览器,它工作正常。这不是我想采取的路线,但问题已经找到。

2 个答案:

答案 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;