15

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

$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 を変更して、自分の Web サイトを使用してこの検索を行ったときに表示されないようにしていると推測しています。ホストが正しいコードを取得できるように、Google Chrome を介してホストにサイトを表示させる方法はありますか? 何を提案しますか?

ありがとう!

4

2 に答える 2

43

私の提案は、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";
}
于 2012-12-05T08:06:51.333 に答える
3

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

このようにして、HTML ソースの変更に対するコードの回復力を少し高めることができます。

xpath を使用する場合は、xpath について少し学習することをお勧めします。コピペはここまでしかできません。

構文に関する簡単な説明は、w3schools.com/xml/xpath_syntax.asp にあります。

于 2012-12-05T07:57:29.770 に答える