用 PHP 抓取一个凌乱的 html 网站
Posted
技术标签:
【中文标题】用 PHP 抓取一个凌乱的 html 网站【英文标题】:Scraping a messy html website with PHP 【发布时间】:2011-04-11 13:53:32 【问题描述】:我处于以下情况。我正在尝试将杂乱的抓取 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 方法,但不知道如何获取下一个兄弟并检查它是一周中的新一天、新表数据还是新一周等。
当然,我也愿意接受其他解决方案。
谢谢。
干杯, 丹东
【问题讨论】:
Scrape web page contents的可能重复 【参考方案1】:您需要转换服务 xsl 和 xslt。
http://en.wikipedia.org/wiki/XSLT
【讨论】:
【参考方案2】:没有灵丹妙药。处理此问题的典型方法是首先通过 htmltidy 过滤 html,以获得一些可预测的标签汤,然后将其提供给解析器(例如 DomDocument
)。然后用DomXPath
选择你需要的节点,组装一个关联数组的中间结构,最后转化成输出xml文档。
提示:使用 firebug 的“复制 XPath”功能来获取节点的 xpath 表达式。
【讨论】:
我按照你的建议做了,用tidy来整理。但从那时起,我又被卡住了,正如我的问题所反映的那样,我试图解析的 html 中没有真正的“树”结构。因此,使用 DomDocument 是我已经使用简单的 html dom 类的地方。无论如何感谢您的回答,但不幸的是,这将需要我投入一些时间并尝试各种东西:(【参考方案3】:Tidy(又名 HTML Tidy)PHP 扩展是一个不错的选择。
http://php.net/tidy
但是,如果您使用的是网络托管服务,它可能未启用,或者您可能需要明确要求。
编辑:
另一个对 php 模块不应该有更多依赖的选项可能是这个项目:
http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/index.php
【讨论】:
【参考方案4】:恕我直言,最“容易出错”的方法是使用真正的浏览器进行抓取,如果使用 Selenium RC 进行远程浏览器控制,这非常容易。请参阅我使用 jQuery 抓取 Google 的示例代码:HERE。
只需几行代码即可提取大部分内容。
【讨论】:
以上是关于用 PHP 抓取一个凌乱的 html 网站的主要内容,如果未能解决你的问题,请参考以下文章