0

Chromeから提供されたXPathの一部を使用する際に問題が発生しました。私が今使っている例はhttp://magic.tcgplayer.com/db/magic_single_card.asp?cn=Jace,%20Memory%20Adeptです。

ページ上部の青い背景で価格を分離しようとしています。Chromeによると、xpathは

//*[="inputForm"]/table[1]/tbody/tr[1]/td/div/table/tbody/tr/td[5]/center/b

そしてそれに基づいて、私はこれを行うことによって価格額で文字列を作成しようとしています:

var baseNode = document.DocumentNode.SelectSingleNode("//*[=\"inputForm\"]//table[1]//tbody//tr[1]//td//div//table//tbody//tr//td[5]//center//b");
String price = baseNode.InnerText;

メッセージでクラッシュする

オブジェクト参照がオブジェクト インスタンスに設定されていません。

ここで何をすべきかわからないので、助けを借りることができます。ありがとう!

4

2 に答える 2

0

ほとんどの場合、ブラウザーのデバッグツール(Chrome、FFなど)によって提供されるXPATHを取得して、HtmlAgilityPackなどのツールでそのまま使用することはできません。

その理由は、ブラウザがメモリ内要素のXPATHを提供するのに対し、HtmlAgilityPackはソースHTMLストリームからXPATHを参照するためです。

2つのXPATH式の間の不一致の最も頻繁なケースは、ブラウザーによって追加される要素です。たとえば、TBODY。TBODYがHTMLファイルで定義されることはめったにありませんが、常にブラウザによって追加されます。だからあなたはこれを試すことができます:

//*[="inputForm"]/table[1]/tr[1]/td/div/table/tr/td[5]/center/b

しかし、私は確かにそれが機能することを保証しません。最良の方法は、ソースHTMLを人間が見て、優れた判別式(および将来的に耐性のある)XPATH式を考え出すことです。たとえば、次のようになります。

//myElement[@class='someclass']

意味「値として「someclass」を持つ「class」属性を持つすべての「myElement」タグを取得します。

HTMLソースと、取得したい要素についてさらにサポートすることができます。

編集:指定したURLに価格を青で表示するには、それをざっと見てみると、判別式が正確に色であることがわかります。したがって、次のようなXPATHを想像できます。

//td[@bgcolor='#D1DFFC']//b

Wichの意味:

  1. ルートから(/)
  2. '#D1DFFC'に等しい値のBGCOLOR属性を使用して、ドキュメント内の任意のTD要素を再帰的に取得します(double /は再帰的に意味します)。
  3. そのTDから、再帰的に調べてB要素を検索します。

したがって、次のようなC#コード:

        HtmlDocument doc = new HtmlDocument();
        doc.Load(yourHtmlFile);

        foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//td[@bgcolor='#D1DFFC']//b"))
        {
            Console.WriteLine(node.InnerHtml);
        }

が表示されます

$17.91
于 2013-01-13T17:18:32.153 に答える
0

xpathify / untemplateツールを確認してください。どちらも非常に互換性のある(そして人間が読める)XPathクエリを生成します。

ショット

于 2013-01-13T23:45:02.763 に答える