【问题标题】:Why <picture> source is not downloaded for offline download为什么不下载 <picture> 源进行离线下载
【发布时间】:2018-01-16 16:15:52
【问题描述】:

我正在下载一个网站供离线查看,网站上的图片写在&lt;picture&gt;&lt;/picture&gt;元素内。

当我使用浏览器或使用网站下载软件下载页面时,图像未下载。

比如这张图片

<picture>
    <source srcset="thumb1.jpg" media="(min-width: 1200px)">
    <source srcset="thumb2.jpg" media="(min-width: 992px)">
    <source srcset="thumb3.jpg" media="(min-width: 600px)">
    <source srcset="thumb4.jpg" media="(min-width: 320px)">

    <img src="main-image.jpg">
</picture>

浏览器下载了main-image.jpg img,但它不下载source图像thumb1.jpg、thumb2.jpg等。这导致下载后所有图像都没有显示页面。

这是为什么呢?为什么浏览器不下载source图片?

该网站建立在名为 Concrete5 的 php CMS 上,因此生成了 html 代码,我无法更改生成的 html。网址是http://www.exrx.net/concrete

这个问题有解决办法吗?是否有免费/付费软件来完成这项任务?

我尝试了一个名为 HTTrack 和 Getleft 的软件。它们的行为方式与浏览器相同。

【问题讨论】:

  • 我编辑了我的答案。使用此解决方案,您将获得在源标签上找到的所有图像路径。

标签: php html image download concrete5


【解决方案1】:

这个问题有解决方案吗?是否有免费/付费软件来完成这项任务?

我不知道有什么工具可以下载源标签上的文件。

编辑 02

使用以下 sn-p 您将抓取所有图像:

$html = file_get_contents('http://www.exrx.net/concrete/');
$doc = new DOMDocument();
libxml_use_internal_errors(true);
$doc->loadHTML($html);
libxml_clear_errors();

$imgs = [];
$pictures = $doc->getElementsByTagName('picture');
foreach ($pictures as $picture) {
    $img = [];
    $img[] = $picture->getElementsByTagName('img')->item(0)->getAttribute('src');
    $sources = $picture->getElementsByTagName('source');
    foreach ($sources as $source) {
        $img[] = $source->getAttribute('srcset');
    }
    $imgs[] = $img;
}

这将产生:

(
    [0] => Array
        (
            [0] => path/to/file/i1-the original-img-tag-image.gif
            [1] => path/to/file/i2.png
            [2] => path/to/file/i3.png
            [3] => path/to/file/i4.png
            [4] => path/to/file/i5.png
        )
    ...
)

然后可以替换这些图像。

来源:
- libxml_use_internal_errors() on SO
- DOM on php.net

【讨论】:

  • 非常感谢,您的第一个解决方案对我来说比其他解决方案更可行。您说“然后删除 new \HtmlObject\Image() 并用您自己的标签替换它”。我是混凝土新手,我应该用什么替换 $tag 变量?
  • 这是否也适用于放置在内容块内的图像?因为网站上 90% 的图片都在内容块中使用,而其他少数图片在图片块中使用。
  • @Tarek Mostafa: Is this also applied to images placed inside the content block? - 不,如果您使用默认核心 content block,那么您将获得带有单个 img 标签的 picture 标签。
  • @Tarek Mostafa:关于你的第二个问题... what should I replace ... 我已经实现了答案。
  • 嗨。我试过你的代码,但它给了我很多错误,其中一个是Call to a member function getThumbnail() on nullCall to a member function alt() on string.. 但即使代码有效,你说它不会影响内容块,这是问题的 90%
猜你喜欢
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 2020-09-23
  • 1970-01-01
  • 2016-10-10
相关资源
最近更新 更多