用 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 网站的主要内容,如果未能解决你的问题,请参考以下文章

PHP 抓取 HTTPS 网站内容

XHTML 网站抓取指南

用一行Python代码在几秒钟内抓取任何网站

用一行Python代码在几秒钟内抓取任何网站

HTML5 手机网站开发

使用 PHP 或 Python 的网页抓取技术