2017-11-05 6 views
0

これについての投稿がたくさんあることは知っていますが、XPathはウェブスクレイピングに関する私の弱点です。私は正しいと確信しているにもかかわらず、以下は動作していないようです。XPATHでcontainsとfollowing-siblingを使用しています

基本的に私は、 "Pivot Point 2nd Level Resistance"というテキストを含むtdを探しており、次の兄弟のtd値をとっています。何が悪かったのか?

( "-兄弟以下// TD [含まれています(テキスト()、 'ピボットポイント 第2レベルの抵抗')]/:: TD [1]")の文字列RS2 = doc.DocumentNode.SelectSingleNode。

<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>

EDを:

以下

のinnerText私はこするてるものですIT:私が掻き取ろうとしているウェブサイトのデータが、事実の後にロードされるように変わったように見えるので、ノードはスクレイプ中に利用できません。私はヘッドレスブラウザのためにPhantom & Seleniumを設定するルートを調べることでこれをテストしました。これは私が取るべきルートではありませんが、問題が見つかりました。

答えて

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パッケージとコード

  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); 

そうXPathがあることに基づいて

   9.43 

を出力して、.NET 4.6.1コンソールプログラムを書いてみます良い。

質問を編集して、どの結果が得られるかを教えて、試行が失敗した箇所の入力とコードの最小限の完全なスニペットを追加する必要があります。

+0

私は申し訳ありませんが、それは私の間違いでした。私は実際のコードに従う前にスラッシュを持っているので、それ以外では違いはありません。 text()を "。"に置き換えようとしました。しかし、それは何も変わらない。 – goodfella

+0

私は修正とあなたの入力HTMLをスニペットを追加しました。ここでは他の 'td'の内部テキストを得ています。 –

+0

私はそれを考え出したと思います - XPathはうまくいきますが、ノードは生成されていません。私はPhantomとSeleniumの道を通り抜け、うまく動作します。私は遅れに対処しなければならないので、ただの失望です。そうでなければ、説明してください。 – goodfella

0

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; 
関連する問題