尝试使用xpath获取页面中的所有图像

时间:2013-01-01 01:39:29

标签: php xpath

我正在尝试使用Xpath捕获页面上的所有图像,然后迭代通过节点列表检查图像是否具有属性如果它我遍历属性直到我到达src现在我的问题是当我得到相对像/us/english/images/12/something.jpeg之类的路径或类似的东西......我的问题是:有没有办法获得完整的路径?

我想到正则表达式返回的src并找到主机,如果主机不在那里使用该网站的网址,但这可能很难检查..

我也想也许我应该解析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>';
                }

            }
        }
    }

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

  1. 将您的xpath查询更改为//img[src]。这将返回具有img属性的所有src元素。使用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。

  3. 更新

    您想要阅读复杂网址中的图片文件路径,例如

    //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