我解析了 Lenta.ru 档案。您只需要选择当天的新闻,没有类别,也就是说,您需要同时具有项目和新闻类的所有div,在所有这些div中,您需要选择 a 元素,相对而言,显示/得到href。
有效但无法正常工作的版本如下所示:
$news = $html->find( 'div[class=news] a' );
foreach( $news as $element ):
echo $element->href . "\n";
endforeach;
错误,因为选择仅适用于带有news类的div,但您需要选择带有item和news类的div。
试过这样的:
$news = $html->find( 'div[class=item news] a' );
...所以:
$news = $html->find( 'div.item.news a' );
...所以:
$news = $html->find( 'div[class="item news"] a' );
不起作用。我分别在这里和这里找到了这些选项。使用 Simple HTML DOM Parser 是基础吗?不,这不是必需的。但是我已经熟悉它并且有使用它的经验,所以选择就落在了它身上。
还有一个想法:先找所有class = item的div,再找其中所有class = news的div ,然后在每个div中找a,没成功。据我了解,方法链是一个la
$news = $html->find( 'div[class=item]' )->find( 'div[class=news] a' );
不会工作(对我不起作用)。怎样成为?
PS我会补充。现在我在这里再次查看,是的,解决方案正在运行,一切正常。如果您完全注册所有课程:
$news = $html->find( 'div[class=item news b-tabloid__topic_news] a' );
但事实是,最后一个类b-tabloid__topic_news并不存在于任何地方,也就是说,它的存在不是必需的。是的,可以用数组编写算法代码,我们首先寻找这样的,然后是其他的,粘合,排序等,但恕我直言,这是错误的。一般来说,问题可以重新表述如下:如何在类中找到所有具有正确元素的元素?
一般来说,很明显这个库无法正确处理选择器,其中两个或多个类被列在一行中。但是,您通常使用报名表寻找正确的方向
div[class=...]。考虑原始测试用例:
让我们的任务是查找
div.news.items并显示链接文本的值zxc123。如您所写,表格的调用返回一个空集。但是,一般来说这等同于写作
div[class="news items"]. 如您所知,除了属性 的直接相等性之外=,其他形式的表示法也是可能的,例如,*=。如果您查看
Simple HTML DOM,您会发现下面的选择器测试函数(代码未完全显示):这表明在指定直接相等时,使用了通常的字符串比较(它们以前被简化为相同的大小写)。但是在指定 occurrence 时
*=,会使用正则表达式。因此,使用这样的选择器将解决您正在寻找的问题。而且,我们可以直接在选择器中指定正则表达式。因此代码对于给定的源示例,成功找到参考实例
<a href="zxc">zxc123</a>。如上所述,使用正则表达式是可以接受的,所以如果源文本会有一组更复杂的类
zxc news asd items qwe,但适合我们:然后编写以下选择器将解决这种情况:
或者如果类的顺序
items和news可以改变,那么下面的表达式是可能的:PS:这种行为似乎没有记录,但它似乎不是 hack-bug,因为条件明确写在代码中,检查正则表达式的第一个字符。