PHP Dom从类中获取多个href

时间:2014-05-11 19:50:11

标签: php dom

有人可以帮助我。

我正试图从一个页面中获取多个href。例如。

页面

<div class="link__ttl">
    <a href="/watch-link-53767-934537" target="_blank" rel="nofollow">Version 1</a>
</div>
<div class="link__ttl">
    <a href="/watch-link-53759-934537" target="_blank" rel="nofollow">Version 1</a>
</div>

PHP Dom

$data = array();

$data['links'] = array();

$page = $this->curl->get($page);
$dom = new DOMDocument();
@$dom->loadHTML($page);

$divs = $dom->getElementsByTagName('div'); 
for($i=0;$i<$divs->length;$i++){   
    if ($divs->item($i)->getAttribute("class") == "link__ttl") {
        foreach ($divs as $div) {
            $link = $div->getElementsByTagName('a');
            $data['links'][] = $link->getAttribute("href");
        }
    }
}

但这不起作用,我得到一个错误

Call to undefined method DOMNodeList::getAttribute()

有人可以帮助我,谢谢

3 个答案:

答案 0 :(得分:1)

$link = $div->getElementsByTagName('a');检索项目列表,但您无法获得属性值&#34; href&#34;的...

尝试使用$link[0]代替$link

答案 1 :(得分:1)

你正在测试div有link__tt类,但是只测试每个所有div。只从拥有该类的div中获取锚点 然后,您尝试从getAttribute调用DOMNodeList,您需要获取基础domnode才能获取该属性。

$divs = $dom->getElementsByTagName('div'); 
for($i=0;$i<$divs->length;$i++){  
    $div = $divs->item($i);
    if ($div->getAttribute("class") == "link__ttl") {
            $link = $div->getElementsByTagName('a');
            $data['links'][] = $link->item(0)->getAttribute("href");
    }
}

另一种解决方案是使用xpath

$path = new DOMXPath($dom);
$as = $path->query('//div[@class="link__ttl"]/a'); 
for($i=0;$i<$as->length;$i++){  
    $data['links'][] = $as->item($i)->getAttribute("href");
}

http://codepad.org/pX5qA1BB

答案 2 :(得分:0)

DOM的任何部分都是节点。属性也是节点,而不仅仅是元素。使用Xpath,您可以直接获取href属性节点列表。

$dom = new DOMDocument();
$dom->loadHtml($html);
$xpath = new DOMXpath($dom);

$result = [];
foreach ($xpath->evaluate('//div[@class = "link__ttl"]/a/@href') as $href)  {
  $result[] = $href->value;
}

var_dump($result);

输出:https://eval.in/150202

array(2) {
  [0]=>
  string(24) "/watch-link-53767-934537"
  [1]=>
  string(24) "/watch-link-53759-934537"
}