【问题标题】:PHP Simple HTML DOM parser give faulty dataPHP 简单的 HTML DOM 解析器给出错误的数据
【发布时间】: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') 找到两个跨度作为第一个 &lt;li&gt; 的子代,并从下一个 &lt;span&gt; 中获取值(即使它是下一个 &lt;li&gt; 的子代)。删除尾随 &lt;/span&gt; 可以解决问题。

我的问题是

  1. 为什么会这样?

  2. 如何解决这个特殊情况? 其他一切都很好,我无法对我的脚本进行重大更改。如果需要,我可以轻松更改 DOM 查询。

我正在考虑计算开始标签和结束标签,如果它们太多,则删除一个 &lt;/span&gt;。既然他们总是&lt;span&gt;s,有没有聪明的方法来用正则表达式检查它?

【问题讨论】:

  • 1.垃圾进垃圾出。您使用的类并不像它声称的那样健壮。 2. 对于这种特殊情况,修复 HTML。对于更一般的情况,请使用更强大的 HTML 解析器:DOMDocument
  • 我开始使用 DOMDocument 执行此操作,最后出现错误,我需要比较字符串长度并且无法将数据转换为纯文本。节点数据包含大量垃圾、标签和东西。这似乎容易多了。我无法更改输入 HTML。

标签: php parsing simple-html-dom


【解决方案1】:

1) Simple 正在尝试通过在某处添加&lt;span&gt; 来修复您的额外&lt;/span&gt;。所以现在你有一个不应该存在的额外跨度。郑重声明,DomDocument 会做同样的事情,尽管可能以更可预测的方式。

2) 简化:

foreach ($dom->find('li > span') as $span) {
  echo $span->plaintext."<br>";
}
//     Link asdasd    <br>     Link asdasd2    <br>

现在你已经告诉它你只想要span,它是li 的孩子。更好的是,执行以下操作:

foreach ($dom->find('span.name') as $span) {
  echo $span->plaintext."<br>";
}

使用这些属性,这就是它们的用处。

【讨论】:

  • 我在这里写的问题被简化了很多,所以它更具可读性。我还需要来自 li:s 的纯文本数据和其他一些东西。但是,我使用您的提示和 $f->parent() 的一些技巧解决了整个问题。谢谢!
【解决方案2】:
$newTxt = preg_replace('/\<\/span\>[\S]*\<\/span\>/','</span>',$txt);

“find(x)”方法是一个重载函数,可以返回以下等价物:

$e->getElementById(x);
$e->getElementsById(x);
$e->getElementByTagName(x); and
$e->getElementsByTagName(x);

在您的第一次通话中使用最后一次通话。在第三种可能性的第二个 $li 中。这可能是一种优化您根据 API 提出的问题的方法。我猜您在 API 中发现了一个错误,因为您在这两种情况下都要求使用第三个调用:

$e->getElementByTagName();

【讨论】:

  • 谢谢!我想我听懂了你的英语:)
  • 是的,我认为正则表达式是我贡献中最重要的部分,因为您描述的情况绝对是一种简化。 (class='name' 和 Link)。我提出的无声建议是,如果使用 Simple HTML DOM 无法解决问题,那么这些基本方法是一个不错的选择。我从来没有对那些不能实现他们所说的那样的工具有太多的耐心。这让他们无法预测。从长远来看,是摆脱无效 HTML 的最佳解决方案。这并不总是可能的,因此我很高兴你找到了一个非侵入性的解决方案。
猜你喜欢
  • 2018-02-23
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
  • 2015-02-14
相关资源
最近更新 更多