我正在编写一个脚本,该脚本需要一个网页并检测使用诸如Facebook之类的按钮之类的东西的次数。由于最好用DOM完成此操作,因此我决定使用PHP的DOMDocument。

不过,我遇到的一个问题是针对Facebook的“赞”按钮之类的元素:

<fb:like send="true" width="450" show_faces="true"></fb:like>

由于从技术上讲,此元素的命名空间为“fb”,因此DOMDocument会发出警告,指出未定义此命名空间前缀。然后,它会继续删除前缀,因此当我提到元素时,其标签不再是fb:like,而是like。

有什么办法可以“预注册” namespace 吗?有什么建议?

最佳答案

我遇到了同样的问题,并提出了以下解决方案/解决方法:

没有一种干净的方法可以使用DOMDocument解析HTML和 namespace 而不丢失 namespace ,但是有一些解决方法:

  • 使用另一个解析器,该解析器接受HMTL代码中的 namespace 。在此处查找HTML解析器的详细列表。这可能是最有效的方法。
  • 如果要坚持使用DOMDocument,则基本上必须对代码进行预处理和后处理。
  • 在将代码发送到DOMDocument-> loadHTML之前,请使用正则表达式,循环或要查找所有命名空间标签的任何内容,并将自定义属性添加到包含该命名空间的开始标签中。
    <fb:like send="true" width="450" show_faces="true"></fb:like>
    

    然后会导致
    <fb:like xmlNamespace="fb" send="true" width="450" show_faces="true"></fb:like>
    
  • 现在将编辑后的代码提供给DOMDocument-> loadHTML。它将删除 namespace ,但将保留导致的属性
    <like xmlNamespace="fb" send="true" width="450" show_faces="true"></like>
    
  • 现在(再次使用正则表达式,循环或任何您想要的东西)查找所有带有xmlNamespace属性的标签,并将该属性替换为实际的 namespace 。别忘了还要在结束标记中添加 namespace !

  • 我不认为OP仍在寻找答案,我只是将其发布给在他们的研究中找到该帖子的任何人。

    09-30 13:59
    查看更多