【问题标题】:Get background image from webpage using DOM XPATH使用 DOM XPATH 从网页获取背景图片
【发布时间】:2020-07-16 18:07:40
【问题描述】:

我正在阅读一个使用 PHP DOM/XPath 的网页,并且我已经设法获得了我需要的文本,但现在我正在尝试获取主图像的 src,但我无法获得它。 更复杂的是,来源与检查员不同。

这里是来源:

<div id="bg">
            <img src="https://example.com/image.jpg" alt=""/>
</div>

这是检查器中的元素:

<div class="media-player" id="media-player-0" style="width: 320px; height: 320px; background: url(&quot;https://example.com/image.jpg&quot;) center center / cover no-repeat rgb(208, 208, 208);" currentmouseover="16">

我试过了:

$img = $xpath->evaluate('substring-before(substring-after(//div[@id=\'bg\']/img, "\')")');

$img = $xpath->evaluate('substring-before(substring-after(//div[@class=\'media-player\']/@style, "background: url(\'"), "\')")');    

但两者都得不到。

这是我的完整代码:

$html = file_get_contents($externalurl);
$doc = new DOMDocument();
    @$doc->loadHTML($html);
    $xpath = new DOMXPath($doc);
    $allChildNodesFromDiv = $xpath->query('//h1[@class="artist"]');
    $releasetitle = $allChildNodesFromDiv->item(0)->textContent;
    echo "</br>Title: " . $releasetitle;

    $img = $xpath->evaluate('substring-before(substring-after(//div[@class=\'media-player\']/@style, "background: url(\'"), "\')")');    
    echo $image;

    $img = $xpath->evaluate('substring-before(substring-after(//div[@id=\'bg\']/img, "\')")');
    echo $image;

【问题讨论】:

  • 这是我正在抓取的 URL:lnk.to/Michael-Gray-Rework,这就是我想要得到的:284fc2d5f6f33a52cd9f-ce476c3c56a27f320262daffab84f1af.ssl.cf3.r…
  • 如果您保存 $html 然后查看该源,则该数据看起来像是在 javascript 中加载的 - media-player 未在任何地方设置。
  • 啊,是的,它出现在:poster : 'https://284fc2d5f6f33a52cd9f-ce476c3c56a27f320262daffab84f1af.ssl.cf3.rackcdn.com/artwork_5e74a44e1e004_CHAMPDL879D_5e74a44e4672b.jpg' 有没有办法抓住它,或者我应该看看像 stripos() 这样的东西?

标签: php dom xpath


【解决方案1】:

我通常不会建议这样做,但是由于您所追求的特定内容是从 javascript 加载的,但内容位于 &lt;script&gt; 标签中,那么正则表达式可能很容易提取。根据您的评论...

啊,是的,它出现在:海报: 'https://284fc2d5f6f33a52cd9f-ce476c3c56a27f320262daffab84f1af.ssl.cf3.rackcdn.com/artwork_5e74a44e1e004_CHAMPDL879D_5e74a44e4672b.jpg'

所以这段代码看起来是poster : '...',的值。

$html = file_get_contents($externalurl);

preg_match("/poster : '(.*)',/", $html, $matches);
echo $matches[1];

这可能会导致 html 发生变化,但现在可能会起作用。

【讨论】:

  • 谢谢 - 这对我有用。有什么理由你通常不建议这样做?
  • 通常,如果您正在处理 HTML 标签,正则表达式是您应该像以前一样使用 DOMDocument 的最后一件事。一个很好的帖子是stackoverflow.com/a/1732454/1213708
猜你喜欢
  • 2021-05-23
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多