我想使用选择器提取网站某些部分中包含的内容。我正在使用简单的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
}