Simple HTML Dom Crawler 返回的不仅仅是属性中包含的内容



我想使用选择器提取网站某些部分中包含的内容。我正在使用简单的HTML DOM来做到这一点。但是,由于某种原因,返回的数据比我指定的选择器中存在的数据多。我已经检查了简单HTML DOM的常见问题解答,但没有看到任何可以帮助我的东西。我也找不到任何关于Stackoverflow的东西。

我正在尝试获取此网页上ul class="river"中包含的所有h2 class="hed"标签的内容/hrefs:http://www.theatlantic.com/most-popular/

在我的输出中,我从其他标签(如 p class="dek has-dek")接收了大量数据,这些数据不包含在 h2 标签中,也不应包含在内。这真的很奇怪,因为我认为代码只允许抓取这些标签中的内容。

如何将输出限制为仅包含 h2 标签中包含的数据?

这是我正在使用的代码:

<div class='rcorners1'>
<?php
include_once('simple_html_dom.php');
$target_url = "http://www.theatlantic.com/most-popular/";
$html = new simple_html_dom();
$html->load_file($target_url);
$posts = $html->find('ul[class=river]');
$limit = 10;
$limit = count($posts) < $limit ? count($posts) : $limit;
for($i=0; $i < $limit; $i++){
  $post = $posts[$i];
  $post->find('h2[class=hed]',0)->outertext = "";
  echo strip_tags($post, '<p><a>');
  }
  ?>
  </div>

输出可以在这里看到。我不仅获得了几个文章链接,还获得了作者的信息、文章的信息等。

您不是在输出h2内容,而是在echo中输出ul内容:

echo strip_tags($post, '<p><a>');

请注意,echo前面的语句不会修改$post

$post->find('h2[class=hed]',0)->outertext = "";

将代码更改为以下内容:

$hed = $post->find('h2[class=hed]',0);
echo strip_tags($hed, '<p><a>');

但是,这只会对第一个找到的h2起作用。所以你需要另一个循环。这是load_file后代码的重写:

$posts = $html->find('ul[class=river]');
foreach($posts as $postNum => $post) {
    if ($postNum >= 10) break; // limit reached
    $heds = $post->find('h2[class=hed]');
    foreach($heds as $hed) {
        echo strip_tags($hed, '<p><a>');
    }
}

如果您仍然需要清除outertext,您可以使用$hed

$hed->outertext = "";

你真的只需要一个循环。考虑一下:

foreach($html->find('ul.river > h2.hed') as $postNum => $h2) {
  if ($postNum >= 10) break;
  echo strip_tags($h2, '<p><a>') . "n"; // the text
  echo $h2->parent->href . "n"; // the href
}

最新更新