简单的dom解析器来找到兄弟姐妹

时间:2014-04-09 08:24:47

标签: php simple-html-dom

我正在尝试抓取一个只是链接的html页面,我需要找到所有标题链接并找到它可能有的任何图像,例如新闻网站将有一个标题。

//scenario 1
<h2><a href="link-to-page">myHeading</a></h2> //image as sibling
<a href="link-to-page"><img src="img.jpg" /></a>

//scenario 2
<h2><a href="link-to-page">myHeading
   <img src="img.jpg" />
</a></h2> // image as child

我可以使用

将图像作为孩子处理
$array=$html->find('h2 a');

foreach($array['h2'] as $h2{
   $heading[]=array('link'=>$h2->href, 'text'=>$h2->plaintext, 'img'=>$h2->find('img',0));
   echo $heading[$i]['link'].'<br />';
   echo $heading[$i]['text'].'<br />';
   echo $heading[$i]['img'].'<br />';
}
//of course this will be layout out differntly but at the moment just trying to get the image

上述代码仅在图片是&#39; H2&#39;的直接子项时才有效。标签,在某些情况下,图像将是一个兄弟姐妹,在这种情况下,我不知道如何处理。我已经尝试过next_sibling(),但我似乎无法让这个工作,有没有人有任何关于如何处理这种情况的建议,其中和图像不是父标签的子,而是兄弟。也许我的方法需要重新思考。我要做的是找到与标题相关的图像,它可以是2个场景中的1个,链接的孩子或兄弟

提前谢谢

2 个答案:

答案 0 :(得分:0)

include_once "simple_html_dom.php";

$url = "index.html";

$html = file_get_html($url);

foreach ($html->find("h2") as $h){

  foreach ($h->find("a") as $a){

    echo $a->href ."<br />";
    $img = $a->find("img",0);
    echo $img->src ."<br />";
  }
}

答案 1 :(得分:0)

使用DOMDocument,这是可能的。如果您需要搜索每个可能的有效标题标记:h1, h2, h3, h4, h5, h6,那么这一切都可以在一个循环中完成。找到标题标记后,我们将使用该节点作为根节点开始搜索其他必需的标记。

$dom = new DOMDocument(''); 

// prevents PHP from warning us that header, footer are invalid tags.
@$dom->loadHTMLFile($url); 

$links  = array();
$images = array();

for($i = 1; $i <= 6; $i++) {
  $heading_level = (string)$i;
  $heading = 'h' . $heading_level;

  foreach($dom->getElementsByTagName($heading) as $h) {   
    foreach($h->getElementsByTagName('a') as $link) {
      array_push($links, array(
        "href"      => $link->getAttribute('href'),
        "innerHTML" => $link->nodeValue
      ));
    }
    foreach($h->getElementsByTagName('img') as $img) {
      array_push($images, array(
        "src" => $img->getAttribute('src')
      ));
    }
  }
}