1

Xpathを使用してページ上のすべての画像をキャッチしようとしています。次に、ノードリストを反復処理して、画像に属性があるかどうかを確認します。属性がある場合は、srcに到達するまで属性を反復処理します。問題は、/us/english/images/12/something.jpegまたはのような相対パスを取得するときです。そのようなもの..私の質問は:フルパスを取得する方法はありますか?

返されたsrcを正規表現して、ホストが存在しない場合はサイトのURLを使用してホストを探すことを考えましたが、それを確認するのは難しい場合があります。

また、URLを解析して、ホスト部分に「。」ドットが含まれている場合は['host']部分をチェックする必要があると思いました。これは、ホストが存在することを意味し、追加しないでください。

これが私がこれまでに持っているものです:

$image_list = $xpath->query('//img');
    foreach($image_list as $element){
        if($element->hasAttributes()){
            foreach($element->attributes as $attribute){
                if(strtolower($attribute->nodeName) == 'src'){
                    echo $attribute->nodeName. ' = ' .$attribute->nodeValue.'<br>';
                }

            }
        }
    }

助けていただければ幸いです。

4

1 に答える 1

3
  1. xpathクエリをに変更します//img[src]。これにより、属性imgを持つすべての要素が返されます。srcmethod.yourコードを使用getAttributeすると、より短く効率的になります。

    $image_list = $xpath->query("//img[@src]");
    for($i=0;$i<$image_list->length; $i++){
        echo "src = ". $image_list->item($i)->getAttribute("src"). "\n";
    }
    
  2. base相対パスの問題については、 elements href属性を見つける必要があります。見つかった場合は、相対URLのベースURIとして使用します。見つからない場合は、このドキュメントのURLを探してみてください。これがベースURIになります。

アップデート

あなたがのような複雑なURLで画像ファイルのパスを読みたいので

//lp.hm.com/hmprod?set=key[source],value[/environment/2012/P01_2972_044R_0.‌​‌​jpg]&amp;set=key[rotate],value[0.65]&amp;set=key[width],value[2921]&amp;set=key[‌​h‌​eight],value[3415]&amp;set=key[x],value[1508]&amp;set=key[y],value[495]&amp;se‌​t=k‌​ey[type],value[FASHION_FRONT]&amp;call=url[file:/product/large]

このようなカスタムパーサーを使用する方がよいでしょう。

$url = $image_list->item($i)->getAttribute("src");
$q = strpos($url, "?");
$query = substr($url, $q+1);
$params = explode("&", html_entity_decode($query));
$data = array();
foreach($params as $e){
    if(preg_match("/key\[([^\]]+)\],value\[([^\]]+)\]/", $e, $m))
        $data[$m[1]]=$m[2];
    elseif(preg_match("/call=([^\[]+)\[([^\]]+)\]/", $e, $m))
        $data[$m[1]]=$m[2];
}

print_r($data);

CodePad

于 2013-01-01T03:00:21.387 に答える