0

Html ノードの解析に使用HtmlAgilityPackし、firebug を使用して、クラス名「ABC」の div など、探しているノード属性を検索しています。探している div の結果が得られない場合があることに気付きました。それをデバッグして見ましたXPATHfrom firebug と fromHtmlAgilityPackが同じ Node:S に対して異なること

/html[1]/body[1]/div[2]/div[3]/table[1]/tr[1]/td[1]/table[1]/tr[1]/td[1]/table[1]/tr[1]/td[1]/div[1]/table[1]/tr[1]/td[1]/div[1]/table[1]/tr[2]/td[1]/div[2]/table[1]/tr[1]/td[1]/div[1]/td[1]/div[1]

/html/body/div[3]/div[3]/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr/td/div/table/tbody/tr/td/div/table/tbody/tr[2]/td/div[2]/table/tbody/tr/td/div/div/table/tbody/tr[3]/td/table/tbody/tr/td[2]/div

1つ目はfirebugです。誰がどこが間違っているか知っていますか?

4

2 に答える 2

0

Html Agility Pack は、マークアップのみに集中しています。物事がどのようにレンダリングされるかはわかりません。Firebug は、現在の in-firefox-memory DOM に依存していると思いますが、これは劇的に異なる可能性があります。そのため、マークアップではなく DOM にのみ存在する TBODY などの要素が表示されます (オプションである場合)。

さらに、特定の Xml ノードに対して可能な XPATH 式が無限にあるという事実を追加できます。

とにかく、一般的に、Html Agility Pack を使用してクエリを実行するときに必要な XPATH には、ツールが提供する完全な XPATH 式は必要ありません。特定の属性 (クラスなど)、id などの識別要素に注目する必要があるだけです。コードは変更に対してより耐性があります。しかし、これは XPATH について少し学ぶ必要があることを意味します (これは良い出発点です: XPath チュートリアル)。したがって、次のような XPATH 式を作成する必要があります。

//div[@class = 'ABC']

「ABC」という名前の CLASS 属性を持つすべての DIV 要素を取得します。

于 2012-12-29T17:22:52.733 に答える
0

2つの理由が考えられます

  1. HTML Agility Pack が HTML を正しく解析していない
  2. Web ページは、ページが読み込まれた後にクライアント スクリプトによって変更されました。Firebug で表示すると、HTML ソースではなく DOM が表示されます。HAP は HTML ソースのみを処理できます。

あなたが示したパスには、(例えば) HAP バージョンには TBODY タグがないことに気付くでしょう。TBODY は HTML マークアップではオプションですが、完全な DOM では必須のタグです。ブラウザーの HTML パーサーは、欠落している場合、常に TBODY を追加します。HAP はしません。これにより、ブラウザーで機能するパスが HAP で失敗する可能性があります。

HAP に代わるものは、標準準拠の HTML パーサー (実際には Firefox と同じパーサー) を使用するCsQuery (nuget 上)です。CsQuery は C# の jquery ポートであり、CSS セレクター (xpath ではない) で動作します。ブラウザーが表示するものと一致する DOM を提供する必要があります。ただし、JavaScript が DOM を変更しているという単純な問題がある場合、これは何も変更しません。

于 2012-12-29T14:35:55.817 に答える