0

さて、xhtml サイトを curl と xpath で解析しようとしています。

サイトには複数の名前空間があります。

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:addthis="http://www.addthis.com/help/api-spec"     xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml">

次のように、サイトのページネーションからすべての URL を取得しようとしています。

$url = [site_im_parsing];

$dom = new DOMDocument();
@$dom->loadHTML($url);  
$xpath = new Domxpath($dom);

$xpath->registerNamespace("x", "http://www.w3.org/1999/xhtml");

$pages = $xpath->query('//x:div[2]/x:table/x:tbody/x:tr/x:td[1]/x:a');

for ($i = 0; $i < $pages->length; $i++) {

    echo $pages->item($i)->getAttribute('href');

}

これはうまくいきません。(x-namespace のないページネーションへの xpath は正しいはずです)。すべての名前空間を登録し、それらすべてを何らかの方法で xpath クエリで使用する必要がありますか?

よろしく、AB

// 質問の更新 //

これは、解析しようとしているページの一部です: (href が必要です)

<div class="pager">
    <table style="width:100%" border="0" cellspacing="0" cellpadding="0">
        <tbody>
            <tr>
                <td>
                    <span class="current">1</span>  | 
                    <a href="http://www.somewebsite.com/catalog?on_offer=1&amp;commodity_offset=1">2</a> | 
                    <a href="http://www.somewebsite.com/catalog?on_offer=1&amp;commodity_offset=2">3</a> | 
                    <a href="http://www.somewebsite.com/catalog?on_offer=1&amp;commodity_offset=3">4</a> | 
                    <a href="http://www.somewebsite.com/catalog?on_offer=1&amp;commodity_offset=4">5</a> | 
                    <a href="http://www.somewebsite.com/catalog?on_offer=1&amp;commodity_offset=5">6</a> | 
                    <a href="http://www.somewebsite.com/catalog?on_offer=1&amp;commodity_offset=6">7</a>        
                </td>
                <td style="text-align:right">
                    <a href="http://www.somewebsite.com/catalog?on_offer=1&amp;commodity_offset=1">Next</a>
                </td>
            </tr>
        </tbody>
    </table>
</div>

文書型は次のとおりです。

html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"

それが違いを生むなら...

4

2 に答える 2

0

わかりました...

ブラウザは、ドキュメントに暗黙のタグ<tbody>が存在しない場合、それを挿入します。xpathは、生のHTML文字列に存在するタグのみを処理するため、<tbody>タグを省略しました。

古いxpathクエリ:

$xpath->query('//div[2]/table/tbody/tr/td[1]/a');

新しい:

$xpath->query('//div[2]/table/tr/td[1]/a');
于 2012-07-17T17:45:56.890 に答える
0

名前空間は無視されるとloadHTML予想されるのでregisterNamespace、まったく使用しないでから使用してください$xpath->query('//div[2]/table/tbody/tr/td[1]/a');。XML として解析する代わりに、名前空間を使用することは理にかなっています。

于 2012-07-16T09:34:53.387 に答える