当前位置: 首页 > 知识库问答 >
问题:

使用DOMDocument::saveHTML避免自动关闭打开的超文本标记语言元素

吕皓
2023-03-14

如果divul容器使用特定类,我的目标是将自定义数据属性添加到该容器中。我从包含有效HTML(完整的<code>div</code>及其内容和结束<code>的HTML片段开始

以下是我可以开始的内容示例:

<div id='gallery-7222-1' class='gallery galleryid-7222 gallery-columns-3 gallery-size-thumbnail'>

这是我目前所尝试的:

// grab all containers from the HTML.
$dom_doc = new DOMDocument();

/*
 * $html here can be the example I posted above.
 * LIBXML_HTML_NOIMPLIED and LIBXML_HTML_NODEFDTD are used
 * to avoid adding a doctype and wrapping the whole output in HTML tags.
 */
$dom_doc->loadHTML( $html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD );

// Let's look for lists and divs.
$ul_tags  = $dom_doc->getElementsByTagName( 'ul' );
$div_tags = $dom_doc->getElementsByTagName( 'div' );

/*
 * Loop through each ul, and add the data.
 * I do more things in there, like checking for what class the ul has,
 * but I've simplified things here. 
 */
foreach ( $ul_tags as $ul_tag ) {
    $ul_tag->setAttribute( 'data-foo', 'bar' );
}

/*
 * Loop through each div, and add the data.
 * I do more things in there, like checking for what class the div has,
 * but I've simplified things here. 
 */
foreach ( $div_tags as $div_tag ) {
    $div_tag->setAttribute( 'data-foo', 'bar' );    
}

// Save our updated HTML.
$html = $dom_doc->saveHTML();

返回的 HTML 包括新的数据属性,但也有一个结束

我首先想到的是删除那个关闭

我该如何阻止 saveHTML() 在这里变得那么聪明,并试图为我修复我的 HTML?

谢谢大家!


共有1个答案

汪明德
2023-03-14
匿名用户

不,你不能说服HTML解析器不解析HTML。最好的解决方案是首先重新思考如何获取数据,并确保不会得到碎片。

如果做不到这一点,您可以尝试先将它视为XML,看看它是否有问题:

<?php
libxml_use_internal_errors(true);
$dom_doc = new DOMDocument();
$remove = "";
// try loading it as xml
if (!$dom_doc->loadXml($html)) {
    // it failed, get the error message
    $err = libxml_get_last_error()->message ?? "";
    // is it because of an unclosed element?
    // find out which element it's breaking on
    if (preg_match("/end of data in tag (.*?) /", $err, $matches)) {
        $remove = "</$matches[1]>";
    }
}
$dom_doc->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

// do stuff

$html = str_replace($remove, "", $dom_doc->saveHTML());

当然,这是假设你处理的HTML是干净的,不会引发其他错误。如果是这种情况,您需要检查< code>libxml_get_errors()中是否有未关闭的元素错误。

 类似资料:
  • 我正在想办法完全自动化詹金斯的硒测试。 我的全部想法是:我想用Selenium IDE记录一个测试。然后将测试另存为HTML代码。将HTML文件放在test1中。和詹金斯一起在服务器上测试。Jenkins应该根据HTML文件的信息进行测试。 最后一句话现在是问题所在。我找不到一种简单的方法将HTML文件转换成可能的JUnit测试并运行它。 我找到了selenese4j,这个想法很好,但它只返回测试

  • 我是新来的。我想解析html,但问题是我们必须在中指定的URL,我将在运行时从其他页面响应此URL。有没有办法将收到的网址传递到中?我读过这样的东西: 但是我不知道如何使用它。我很想知道是否有其他方法比jsoup更好。

  • 对于上面的html内容,我如何使用Jsoup解析并获取文本 当我使用 我得到了这样的东西

  • 我有一个非常简单的问题,我有一个div在一个html页面,我可以通过他的XPath访问这是:。 我想要一个XPath,可以提供这个div的所有子元素,但我找不到它。我需要用硒的findElements方法获取元素,但我测试的方法不起作用: 我的超文本标记语言代码如下: 我想这样使用XPath: 我的Java Selenium脚本如下: 我应该使用什么XPath来获取的子级? 编辑1:我确实使用了*

  • 我正在尝试使用放心来检查服务器返回的HTML文档的一些属性。演示该问题的SSCCE如下所示: 现在,此尝试以,这是由所有可能的错误大约 30 秒左右后超时! 如果我用< code>xmlPathConfig()删除这一行。用()。功能(...)当特性“http://Apache . org/XML/features/disallow-DOCTYPE-decl”设置为true时,由于< code>D

  • 定义和使用自定义标记可以吗?(这不会与将来的html标记冲突)-通过更改outerHTML替换/呈现这些标记?? 我在下面创建了一个演示,看起来效果不错 问题的最新情况: 让我进一步解释一下。请假设浏览器上启用了JavaScript-也就是说,应用程序不应该在没有javascript的情况下运行。 我见过使用自定义属性在指定标记中定义自定义行为的库。例如,角度。js大量使用自定义属性。(它还有关于