用PHP抓一个凌乱的html网站

时间:2010-09-13 09:25:37

标签: php html dom screen-scraping preg-match

我遇到以下情况。我正在尝试将凌乱的HTML代码转换为漂亮而整洁的xml结构。

已删除网站的部分HTML代码:

<p><span class='one'>week number</span></p>

<p><span class='two'>day of the week</span></p>
<table class='spreadsheet'>
table data
</table>

<p><span class='two'>another day of the week</span></p>
<table class='spreadsheet'>
table data
</table>

<p><span class='one'>another week number</span></p>

ETC

现在我想用php创建以下xml结构:

<week number='week number'>
 <day name='day of the week'>
  <data id='table data'>table data</data>
 </day>

 <day name='another day of the week'>
  <data id='table data'>table data</data>
 </day>
</week>
<week number='another week number'>
 ETC
</week>

一直在尝试简单的html dom方法,但不知道如何获得下一个兄弟,并检查它是一周中的新的一天,新的表格数据还是新的一周等等。

我当然也对其他解决方案持开放态度。

感谢。

干杯, Dandoen

4 个答案:

答案 0 :(得分:1)

没有银弹。处理此问题的一种典型方法是首先通过htmltidy过滤html,以获得有点可预测的标记汤,然后将其提供给解析器(例如DomDocument)。然后使用DomXPath选择所需的节点并组装关联数组的中间结构,最后将其转换为输出xml文档。

提示:使用firebug的“复制XPath”功能来获取节点的xpath表达式。

答案 1 :(得分:1)

一个很好的选择是Tidy(又名HTML Tidy)PHP扩展。

http://php.net/tidy

但是,如果您使用的是网络托管服务,则可能未启用它,或者您可能需要明确要求它。

编辑:

关于php模块不应该有任何更多依赖关系的另一个选项可能类似于这个项目:

http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/index.php

答案 2 :(得分:0)

您需要转换服务xsl和xslt。

http://en.wikipedia.org/wiki/XSLT

答案 3 :(得分:0)

最容易出错的“错误”方法是使用真正的浏览器进行刮擦,如果使用Selenium RC进行远程浏览器控制,这非常容易。请参阅我的示例代码,使用jQuery抓取Google:http://github.com/tszming/Selenium-Google-Scrapper

大多数内容只需几行代码即可提取。