【问题标题】:Malformed HTML and XPath query格式错误的 HTML 和 XPath 查询
【发布时间】:2011-09-03 19:45:48
【问题描述】:

我的 HTML 格式不正确,无法更改。运行 XPath 查询根本不会返回节点:

$el = $xpath->query("//a[@class='product']/table"); // can get a tag with "//a[@class='product']"
print_r($el->length); // 0

HTML 格式错误:

<a class="product" href="#">
    <table width="385" cellspacing="0" cellpadding="5" style="border:1px; border-bottom-color:#E2E2E2; border-bottom-style:solid;">
        <tr>
            <td width="55">
                <img src="http://foobar.com:8080/img/1212.jpg" height="50" width="50">
            </td>
        <td width="195">Cod.27731<br>Product Name</td>
            <td width="60" align="center"><a href="?pageContent=items&price=fab&prodcod=27731">Details</a></td>
            <td width="80" nowrap>
                <div style="color:#FF0000;"><strong>$ 35.23</strong></div>
        </td>
        </tr>
    </table>
</a>

我可以得到 a 元素但我不能得到它的子元素(表格)...

【问题讨论】:

  • 如果您使用$document-&gt;saveHTML(),您会注意到DomDocument 会在&lt;table&gt; 之前自动关闭&lt;a&gt; 标签。
  • 将 saveHTML() 修复格式错误的 HTML 吗?
  • 我认为loadHTML() 已经修复了格式错误的 HTML(在这种情况下,通过关闭 a 标签)
  • saveHTML 返回一个字符串,但我不能用它来创建一个新的 DOMDocument :(

标签: php html dom xpath malformed


【解决方案1】:

由于 libxml 将更改 HTML 以关闭表格之前的 a 元素,因此您必须改为查询 following-sibling 表格,例如

$dom = new DOMDocument;
$dom->loadHtml($html);
$xpath = new DOMXpath($dom);
$el = $xpath->query("//a[@class='product']/following-sibling::table");
echo $dom->saveHtml($el->item(0));

或者从a元素遍历

$dom = new DOMDocument;
$dom->loadHtml($html);
$xpath = new DOMXpath($dom);
$table = $xpath->query("//a[@class='product']")->item(0)->nextSibling;
echo $dom->saveHtml($table);

请注意,将参数传递给 saveHTML requires at least PHP 5.3.6

【讨论】:

  • @thom 是的,当你使用loadHTML libxml 会尝试在一定程度上更正 HTML 以使其可解析。 saveHTML() 只会将 DOM 树序列化为 HTML 标记。另一种方法是在将损坏的 HTML 传递给 DOM 之前通过 tidy 运行损坏的 HTML。这将允许您在一定程度上影响损坏的标记如何得到修复。
  • 非常感谢!问题已解决!
猜你喜欢
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 2019-08-21
  • 1970-01-01
相关资源
最近更新 更多