【问题标题】:PHP dom parser: How to get element count only if it comes after another element?PHP dom解析器:只有在另一个元素之后才获取元素计数?
【发布时间】:2020-09-20 05:39:21
【问题描述】:

我正在尝试计算散布在整篇文章中的 HTML 页面上有多少图像,但我不想计算在文章正文开始之前出现的图像。问题是类是完全相同的,所以我不能用它来帮助我,而且不是每篇文章都以图像开头。所以 HTML 可能看起来像这样:

<img class="image-asset" src="image.jpg">
<p>First line</p>
<p>Second line</p>
<img class="image-asset" src="second_image.jpg">
<p>Third line</p>
<img class="image-asset" src="third_image.jpg">

在这种情况下,我只想计算第二张和第三张图像。这是我的代码,目前已成功计算每张图片:

$photoCount = count($html->find('div.image-asset'));

【问题讨论】:

  • 所以在这个例子中,它是你不想计算的第一张图片? DOM 的哪一部分定义了“文章”是什么?
  • “文章”文本的开头是否总是在&lt;p&gt; 标记中?
  • 我看到了一些选项来实现你想做的事情。然而,这取决于文章是如何定义标记的。所以选择是遍历 dom 树,使用回调函数或使用正则表达式。
  • 正确,第一张图片-如果是文章中的第一件事-我不想数。是的,在我要计算的第一张照片之前总会有至少一个

    标签。

标签: php parsing dom web-scraping simple-html-dom


【解决方案1】:

我相信您正在寻找以下方面的东西:

$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);

$target = $xpath->query('//img[preceding-sibling::p]');
echo count($target), PHP_EOL;
//and just to be on the safe side:
foreach ($target as $t) {
    echo $t->ownerDocument->saveHTML($t), PHP_EOL;
};

输出:

2
<img class="image-asset" src="second_image.jpg">
<img class="image-asset" src="third_image.jpg">

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-03
    • 2015-08-22
    • 1970-01-01
    • 2020-10-24
    • 2013-04-21
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    相关资源
    最近更新 更多