【发布时间】:2013-08-05 00:10:19
【问题描述】:
我正在使用PHP Simple HTML DOM 解析具有以下 HTML 的网页。注意每个<li> 中额外的</span>-tags。
<li>
<span class="name">
<a href="">Link</a> asdasd
</span>
</span>
</li>
<li>
<span class="name">
<a href="">Link</a> asdasd2
</span>
</span>
</li>
我的查询是:
$lis = $dom->find('li');
foreach ($lis as $li) {
$spans = $li->find('span');
foreach ($spans as $span) {
echo $span->plaintext."<br>";
}
}
我的输出是:
Link asdasd
Link asdasd2
-----------
Link asdasd2
-----------
如您所见,find('span') 找到两个跨度作为第一个 <li> 的子代,并从下一个 <span> 中获取值(即使它是下一个 <li> 的子代)。删除尾随 </span> 可以解决问题。
我的问题是:
为什么会这样?
如何解决这个特殊情况? 其他一切都很好,我无法对我的脚本进行重大更改。如果需要,我可以轻松更改 DOM 查询。
我正在考虑计算开始标签和结束标签,如果它们太多,则删除一个 </span>。既然他们总是<span>s,有没有聪明的方法来用正则表达式检查它?
【问题讨论】:
-
1.垃圾进垃圾出。您使用的类并不像它声称的那样健壮。 2. 对于这种特殊情况,修复 HTML。对于更一般的情况,请使用更强大的 HTML 解析器:DOMDocument
-
我开始使用 DOMDocument 执行此操作,最后出现错误,我需要比较字符串长度并且无法将数据转换为纯文本。节点数据包含大量垃圾、标签和东西。这似乎容易多了。我无法更改输入 HTML。
标签: php parsing simple-html-dom