【问题标题】:extract image elements from html从html中提取图像元素
【发布时间】:2013-01-17 10:58:04
【问题描述】:

我正在尝试从 html 代码中获取图像标签。

我有

   $parser=new DOMDocument;   

   $parser->loadHTML($this->html);
        foreach($parser->getElementsByTagName('img') as $imgNode){
         echo $parser->saveHTML($imgNode);
       }

$this->html 包含大量 html 代码和 javascripts。

例如:

<div id='someid'>
<button id='bt' onclick='clickme()'>click me</button>
<img src='test.jpg'/>
.....
.....
more...

</div>

<div>
.....
.....
more...

我收到一条警告说

DOMDocument::loadHTML(): htmlParseEntityRef: expecting ';' in Entity,

我不确定如何解决这个问题,也不知道是否有更好的方法可以从大量 html 代码中提取所有图像。

有什么想法吗? 非常感谢!

【问题讨论】:

    标签: php dom


    【解决方案1】:

    我绝不是这些问题的专家(目前),但我希望这在某种程度上有所帮助。

    根据this answer by troelskn,您可以使用libxml_use_internal_errors 使DOM 解析器更能容忍格式错误的HTML。这可能会帮助您摆脱该错误。

    可以使用DOMXPath 解析文档的所有图像。它采用DOMDocument 作为参数,让您可以对文档运行XPath 查询。

    $document = new DOMDocument();
    $document->loadHTML($your_html);
    
    // Suppress parse errors.
    libxml_use_internal_errors(false);
    
    $xpath = new DOMXPath($document)
    
    // Find all img tags.
    $img_nodes = $xpath->query('//img')
    

    DOMXPath::query 返回一个DOMNodeList,可以使用DOMNodeList::item 循环,返回一个DOMNode

    for($i = 0; $i > $img_nodes->length; $i++)
    {
        $node = $img_nodes->item($i);
        // Manipulate the node.
    }
    

    免责声明:我发布的代码未经测试,是使用手册整理的。

    【讨论】:

    • "您可以通过使用 libxml_use_internal_errors 使 DOM 解析器更能容忍格式错误的 HTML"--错误!这只是消除了错误。 loadHTML() 已经能够容忍 html 错误,尽管是以非标准方式。
    • @FrancisAvila 提高抱怨问题的阈值会使其更宽容,你不是说吗?
    • 说“更宽容”意味着不同的解析行为,而不是不同的错误报告。此外,错误仍然被收集(通过 libxml),只是没有立即发送到 PHP 的错误报告层,所以可以说它也不是你的标准“更宽容”。
    • @FrancisAvila 以pain tolerance 为例。根据pain threshold 的说法,即使一个人不会在痛苦中大喊大叫,但痛苦可能仍然存在。因此,即使一个人经历了痛苦(阅读:错误就在那里),他也可能不会觉得有必要为此大声疾呼(阅读:报告错误)。回到我的回答,确定你以后可以使用该函数来收集错误,但我正在使用它来抑制它们。
    猜你喜欢
    • 2021-01-07
    • 2016-05-17
    • 2017-07-03
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多