10

これは、HAP を使用して要素の値を取得する最初の試みです。InnerText を使用しようとすると、null オブジェクト エラーが発生します。

私がスクレイピングしている URL は次のとおり です 。要約表。

私のコードは一番下にあります。まず、これについて正しい方法で行っているかどうかを知りたいのですが? もしそうなら、それは私の XPath 値が間違っているということですか?

XPath 値は、私が見つけた htmlagility helper というユーティリティを使用して取得されました。以下の XPath の firebug バージョンでも同じエラーが発生します:- /html/body/div[3]/div/table/tbody/tr[3]/td/table/tbody/tr[5]/td[3 ]

私のコード:-

WebClient myPivotsWC = new WebClient();
string nodeValue;
string htmlCode = myPivotsWC.DownloadString("http://www.mypivots.com/dailynotes/symbol/659/-1/e-mini-sp500-june-2013");
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(htmlCode);
HtmlNode node = doc.DocumentNode.SelectSingleNode("/html[1]/body[1]/div[3]/div[1]/table[1]/tbody[1]/tr[3]/td[1]/table[1]/tbody[1]/tr[5]/td[3]");
nodeValue=(node.InnerText);

ありがとう、ウィル。

4

2 に答える 2

30

FireBug や Chrome などの開発者ツールに依存して、目的のノードの XPATH を決定することはできません。そのようなツールによって提供される XPATH はメモリ内の HTML DOM に対応し、Html Agility Pack はサーバーから返された生の HTML のみを認識します。

あなたがする必要があるのは、送り返されたものを視覚的に見ることです (または単にソースを表示するだけです)。たとえば、TBODY 要素がないことがわかります。したがって、判別可能なものを見つけて、たとえばXPATH 軸を使用する必要があります。また、XPATH が機能したとしても、ドキュメントの変更に対してあまり耐性がないため、スクレイピングをより将来的に保証するために、より「安定した」ものを見つける必要があります。

動作するように見えるコードは次のとおりです。

HtmlNode node = doc.DocumentNode.SelectSingleNode("//td[@class='dnTableCell']//a[text()='High']/../../td[3]");

これはそれが何をするかです:

  • 「dnTableCell」に設定された CLASS 属性を持つ TD 要素を見つけます。// トークンは、検索が XML 階層で再帰的であることを意味します。
  • 'High' に等しいテキスト (内部テキスト) を含む A 要素を見つけます。
  • 2 つの親を上に移動します (最も近い TR 要素に到達します)
  • そこから3番目のTD要素を選択します
于 2013-04-05T08:01:01.470 に答える
2

Simon Mourierが説明したように、サーバーから送信された生の HTML を取得しました。必要な要素はまだレンダリングされていないため、DOM に存在しないため、まだ取得できません。この問題の簡単な回避策は、HTML を取得してスクレイピングするよりも、Web レンダラーを使用して DOM を構築することです。私は次のようにWatiNを使用します:

WatiN.Core.Settings.MakeNewInstanceVisible = false;
WatiN.Core.Settings.AutoMoveMousePointerToTopLeft = false; 
IE ie = new IE();
ie.GoTo(urlLink); 
ie.WaitForComplete();
string html = ie.Html;
ie.close();
于 2013-10-20T08:58:44.583 に答える