【问题标题】:Simple HTML Dom Crawler returns more than contained in attributes简单的 HTML Dom Crawler 返回的不仅仅是属性中包含的内容
【发布时间】:2016-06-02 03:23:53
【问题描述】:

我想使用选择器提取网站某些部分中包含的内容。我正在使用简单的 HTML DOM 来执行此操作。但是由于某种原因,返回的数据多于我指定的选择器中的数据。我检查了FAQ of Simple HTML DOM,但没有看到任何可以帮助我的东西。我在 Stackoverflow 上也找不到任何东西。

我正在尝试获取此网页上 ul class="river" 中包含的所有 h2 class="hed" 标记的内容/href:@987654322 @

在我的输出中,我从其他标签(如 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>

Output can be seen here。我不仅获得了几个文章链接,还获得了作者的信息、文章的信息等。

【问题讨论】:

    标签: php web-crawler simple-html-dom


    【解决方案1】:

    您输出的不是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 = "";
    

    【讨论】:

    • 嗨 trincot,我试过了,它可以部分工作,但现在我只得到一个文章标题而不是所有标题。我换掉了 $post->find('h2[class=hed]',0)->outertext = ""; echo strip_tags($post, '

      ');用你的代码,对吗?

    • 是的,这是正确的。我已经用h2 标签上的循环更新了我的答案。因为我在find('h2[class=hed]',0) 中看到了0,所以我以为你对其他h2 标签不感兴趣,但显然你是;-)
    • 谢谢!冒着失去耐心的风险,我有一个后续问题。我也想要链接,所以我现在找到了$heds = $post-&gt;find('a[data-omni-click=inherit]');- 虽然
      却给了我一个不需要的属性。我想从输出中排除它,所以我在发现可以排除带有感叹号here 的属性后尝试了$heds = $post-&gt;find('a[data-omni-click=inherit]', '!figure');。但是这没有用。你知道如何排除一个属性吗?非常感谢您的帮助!
    【解决方案2】:

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

    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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      • 2017-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多