質問: selectedNode.XPath ``` 次に、HAPから得られるxpathValueは > / html 1 / body 1 /セクション1 / div 2 / div 1 / div 1 / div 1 / div 1 / div 1 / a 1 > >
回答: WebDriverは、XPATHで作業する場合、常にターゲットブラウザに依存します。技術的には、それはブラウザ(ブラウザがFirefoxかChromeかにかかわらず、11までのIEはXPATHをサポートしていません) 残念ながら、ブラウザのメモリにあるDOM(要素と属性の構造) **は、**おそらくHtml Agility Packに提供したDOMと**同じではありません** 。ブラウザのメモリからDOMの内容をHAPに読み込んだ場合(例:document.OuterHtmlに相当)は同じです。一般的には、開発者はHAPを使用してブラウザなしでサイトをスクラップし、ネットワークストリーム(HTTP GETリクエストから)または未加工ファイルからフィードを取得するため、これは当てはまりません。 この問題は簡単に説明できます。たとえば、次のもののみを含むファイルを作成するとします。 ``` hello world ``` (HTMLなし、本体タグなし、これは実際には無効なhtmlファイルです) HAPでは、次のようにロードすることができます: ``` HtmlDocument doc = new HtmlDocument(); doc.Load(myFile); ``` HAPの構造はこれだけです: ``` +table +tr +td 'hello world' ``` HAPはブラウザーではなく、パーサーであり、実際にはHTML仕様を知らないので、タグの束を解析してDOMを構築する方法を知っているだけです。たとえば、HTMLで始まるドキュメントがBODYを含んでいるか、またはブラウザによって推論されたときにTABLE要素に常にTBODYという子があることはわかりません。 しかし、Chromeブラウザでは、このファイルを開き、それを調べてXPATHにTD要素を尋ねると、次のように報告されます。 ``` /html/body/table/tbody/tr/td ``` クロムはそれだけでこれを作ったので...あなたが見ているように、2つのシステムは一致しません。 ソースHTMLで利用可能な`id`属性がある場合は、たとえば、次のHTMLを使用した方がストーリーが優れています。 ``` hello world ``` Chromeは次のXPATHを報告します(できるだけ`id`属性を使用しようとします): ``` //*[@id="hw"] ``` HAPでも同様に使用できます。しかし、これはすべての時間では動作しません。たとえば、次のHTML ``` hello world ``` ChromeはこのXPATHをTDに生成します: ``` //*[@id="mytable"]/tbody/tr/td ``` あなたが見ているように、これはその推論されたTBODYのために再びHAPで使用できません。 したがって、結局のところ、盲目的には、ブラウザで作成されたXPATHを、それらのブラウザ以外のコンテキストで使用することはできません。他の文脈では、他の判別式を見つける必要があります。 実際には、XPATHの変更に対する抵抗力が高まるため、私は個人的には何とか良いことだと思っています。しかし、あなたは考える必要があります:-) さあ、あなたの場合に戻ってみましょう:) 次のC#サンプルのコンソールケースは正常に動作します。 ``` static void Main(string[] args) { var web = new HtmlWeb(); var doc = web.Load("http://www2.epa.gov/languages/traditional-chinese"); var node = doc.DocumentNode.SelectSingleNode("//section[@id='main-content']//div[@class='pane-content']//a"); Console.WriteLine(node.OuterHtml); // displays ...etc..." } ``` ストリームやファイルの構造(またはブラウザに表示される内容でも、気にしないでTBODYを避けてください)を見れば、最も簡単です * `id`見つける(ブラウザのように) * 再帰的か否かにかかわらず、ユニークな子または孫の要素または属性を見つける * あまり正確なXPATHを避けてください。 `p/p/p/div/a/div/whatever`が悪いものなのか ここで`main-content` `id`属性の後に、特別なクラスを持つDIVを(再帰的に`//` )調べ、利用可能な最初の子`A`を(再帰的に)見ます。 このXPATHはwebdriverとHAPで動作するはずです。 このXPATHも動作することに注意してください: `//div[@class='pane-content']//a`しかし、それは私には少しばかり見えます。 `id`属性の足を設定することは、しばしば良い考えです。