Simple HTML Dom Crawler returns 多于包含在属性中
Simple HTML Dom Crawler returns more than contained in attributes
我想使用选择器提取网站某些部分中包含的内容。我正在使用 Simple HTML DOM 来执行此操作。但是由于某种原因,返回的数据多于我指定的选择器中存在的数据。我检查了 FAQ of Simple HTML DOM,但没有看到任何可以帮助我的东西。我也无法在 Whosebug 上找到任何内容。
我正在尝试获取 ul 中包含的所有 h2 class="hed" 标签的 contents/hrefs class="river" 在这个网页上: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>
Output can be seen here。我不仅获得了几个文章链接,还获得了作者信息、文章信息等。
你输出的不是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
}
我想使用选择器提取网站某些部分中包含的内容。我正在使用 Simple HTML DOM 来执行此操作。但是由于某种原因,返回的数据多于我指定的选择器中存在的数据。我检查了 FAQ of Simple HTML DOM,但没有看到任何可以帮助我的东西。我也无法在 Whosebug 上找到任何内容。
我正在尝试获取 ul 中包含的所有 h2 class="hed" 标签的 contents/hrefs class="river" 在这个网页上: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>
Output can be seen here。我不仅获得了几个文章链接,还获得了作者信息、文章信息等。
你输出的不是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
}