【问题标题】:DOMNode->ChildNodes->length returns incorrect valueDOMNode->ChildNodes->length 返回不正确的值
【发布时间】:2015-02-12 09:37:26
【问题描述】:

我有一个 PHP 脚本,它解析网页并使用 DOMDocument 和 DOMXpath 库在网页中导航。文运行$tr->ChildNodes->length得到3个<td>,指令返回6,其中0返回第一个<td>,1是空字符串(19),2是第二个<td>,3又是空字符串(19),4 是第三个<td>,5 是另一个空字符串(19),6 是页面的整个 HTML。 (使用$dom->saveHTML($tr->childNodes->item(0) 等测试) 我如何让->length 返回正确的号码?为什么它的行为如此奇怪?

<tr>
  <td>
    <span>...</span>
  </td>
  <td>
    <a href="..."><img ...></a>
  </td>
  <td>
    <div>
    <span>
      <a href="...">...</a>
      <br>
      <ahref="...">...</a>
    </span>
    <span>...</span>
    <br><br>
    <a href="...">...</a>, <a href="...">...</a>
    </div>
    <div>
      <a href="...">...</a> | <a href="...">...</a>
    </div>
  </td>
</tr>

请注意,我省略了一些属性,如样式、类、数据等。

【问题讨论】:

    标签: php web-scraping domdocument domxpath


    【解决方案1】:

    这种行为并不“奇怪”。在 DOM 中,换行符实际上被视为空节点。要获得“正确”数量的子节点,您必须事先从您尝试解析的文档中删除换行符,或者获取所有子节点并从此节点列表中删除空元素。

    【讨论】:

    • 感谢您的信息。但是$dom-&gt;preserveWhiteSpace = false 是否有助于删除不需要的空格?
    • 我想在你的情况下它没用。它有助于保留代码中元素的缩进,在这里您处理的不是空格而是换行符。所以你最好只遍历节点列表和$tr-&gt;removeChild()空元素
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 2021-10-26
    • 2015-10-13
    • 2014-12-06
    • 2021-02-01
    相关资源
    最近更新 更多