2012-12-05 17 views
9

現在、フォーラムからいくつかのデータを解析しようとしています。ここでは、コードは次のとおりです。PHPでXpathを使用してHTMLを解析する

とにかく
$xml = simplexml_load_file('https://forums.eveonline.com'); 

$names = $xml->xpath("html/body/div/div/form/div/div/div/div/div[*]/div/div/table//tr/td[@class='topicViews']"); 
foreach($names as $name) 
{ 
    echo $name . "<br/>"; 
} 

、問題は、私は私がパスを得るのを助けるために、GoogleのXPath拡張を使用している、と私は、Googleがそれが起動しないように十分なHTMLを変更していることを推測しているということです私はこの検索を行うために私のウェブサイトを使用します。それは正しいコードを取得するように私はGoogleクロムを介してサイトを見てホストを作ることができるいくつかのタイプの方法はありますか?何をお勧めしますか?

ありがとうございます!

+1

ウェブブラウザでJavascriptを無効にしてみましたか?あなたのPHPはそれを使用しないでしょう、したがって、ウェブサイト上のjavascriptによって行われた変更は、サーバにはありません。 –

+0

XPathはXML用であり、HTML用ではありません。 – GolezTrol

+1

私はこれを実行しているページでJSが実行されていません。私はXPathがXMLのためのものだと理解していますが、私はGoogle検索で見たことから、HTMLにもよく使われています。 – VixenSoul

答えて

3

ダブル '/'はxpathを検索します。したがって、xpath '// table'を使用すると、すべてのテーブルが取得されます。 xpath 'html/body/div/div/form'の下にあるすべてのテーブルを取得するために、 'html/body/div/div/form/table'のようなxp​​ath構造体でこれをもっと深く使うこともできます。

このようにして、コードをhtmlソースの変更に対してさらに弾力を持たせることができます。

私はあなたがそれを使いたいならば、xpathについて少し学ぶことを提案します。コピー貼り付けは、これまでのところあなたを得るだけです。

構文についての簡単な説明がhttp://www.w3schools.com/xpath/xpath_syntax.asp

36

私の提案で発見することができ、それはで動作するように非常に良くインターフェイスだとタスクが多く、より直感的になり以来、SimpleXMLのとは対照的に、常にDOMDocumentを使用することです。

次の例は、HTMLをDOMDocumentオブジェクトにロードし、XPathを使用してDOMを照会する方法を示しています。あなたが本当にやらなければならないことは、topicViewsのクラス名を持つすべてのTD要素と、この意志出力このXPathクエリによって返さのDOMNodeListで見つかったのnodeValueメンバーのそれぞれを見つけることです。

/* Use internal libxml errors -- turn on in production, off for debugging */ 
libxml_use_internal_errors(true); 
/* Createa a new DomDocument object */ 
$dom = new DomDocument; 
/* Load the HTML */ 
$dom->loadHTMLFile("https://forums.eveonline.com"); 
/* Create a new XPath object */ 
$xpath = new DomXPath($dom); 
/* Query all <td> nodes containing specified class name */ 
$nodes = $xpath->query("//td[@class='topicViews']"); 
/* Set HTTP response header to plain text for debugging output */ 
header("Content-type: text/plain"); 
/* Traverse the DOMNodeList object to output each DomNode's nodeValue */ 
foreach ($nodes as $i => $node) { 
    echo "Node($i): ", $node->nodeValue, "\n"; 
} 
関連する問題