3

我正在尝试抓取一个 html 表并将其数据保存在数据库中。您发现哪些策略/解决方案有助于实现该计划。

我对 Java 和 PHP 最满意,但任何语言的解决方案都会有所帮助。

编辑:有关更多详细信息,UTA(盐湖城公交系统)在其网站上提供了公交时刻表。每个时刻表都显示在一个表格中,该表格在标题中包含车站,在行中包含出发时间。我想通过时间表并将信息以我可以查询的形式保存在表中。

这是时间表的起点

4

8 回答 8

3

有一本关于这个主题的好书:Kevin Hemenway 和 Tara Calishain 的 Spidering Hacks

于 2008-09-16T14:54:04.647 回答
3

这完全取决于您的 HTML 抓取的正确程度?如果它是有效的 XHTML,您可以简单地对其使用一些 XPath 查询来获得您想要的任何东西。

php 中的 xpath 示例:http: //blogoscoped.com/archive/2004_06_23_index.html#108802750834787821

将表格刮入数组的辅助类:http ://www.tgreer.com/class_http_php.html

于 2008-09-16T14:54:08.687 回答
2

我发现脚本语言通常更适合执行此类任务。我个人更喜欢 Python,但 PHP 也可以。在 Java 中切碎、切碎和解析字符串实在是太麻烦了。

于 2008-09-16T14:55:36.217 回答
1

我之前尝试过屏幕抓取,但我发现它非常脆弱,尤其是动态生成的代码。我找到了一个第三方 DOM 解析器,并使用它通过类似正则表达式的匹配模式来导航源代码,以便找到我需要的数据。

我建议尝试找出该站点的所有者是否有已发布的 API(通常是 Web 服务)来从他们的系统中检索数据。如果没有,那么祝你好运。

于 2008-09-16T14:54:08.843 回答
1

这对于 Perl 和以下 CPAN 模块来说是迄今为止最简单的:

CPAN 是 Perl 模块的主要分发机制,可通过运行以下 shell 命令访问,例如:

# cpan HTML::Parser

如果你在 Windows 上,事情会更有趣,但你仍然可以这样做:http ://www.perlmonks.org/?node_id=583586

于 2008-09-16T15:02:57.387 回答
1

钢琴黑客忽略了HTML::TableExtract模块,该模块正是为这类事情而设计的。您仍然需要LWP来检索表。

于 2008-09-16T15:22:37.247 回答
1

如果你想要的是一个 csv 表的表格,那么你可以使用这个:使用 python:

例如,假设您想从以下网站以 csv 格式抓取外汇报价:fxoanda

然后...

from BeautifulSoup import BeautifulSoup
import urllib,string,csv,sys,os
from string import replace

date_s = '&date1=01/01/08'
date_f = '&date=11/10/08'
fx_url = 'http://www.oanda.com/convert/fxhistory?date_fmt=us'
fx_url_end = '&lang=en&margin_fixed=0&format=CSV&redirected=1'
cur1,cur2 = 'USD','AUD'
fx_url = fx_url + date_f + date_s + '&exch=' + cur1 +'&exch2=' + cur1
fx_url = fx_url +'&expr=' + cur2 +  '&expr2=' + cur2 + fx_url_end
data = urllib.urlopen(fx_url).read()
soup = BeautifulSoup(data)
data = str(soup.findAll('pre', limit=1))
data = replace(data,'[<pre>','')
data = replace(data,'</pre>]','')
file_location = '/Users/location_edit_this'
file_name = file_location + 'usd_aus.csv'
file = open(file_name,"w")
file.write(data)
file.close()

一旦以这种形式获得它,您就可以将数据转换为您喜欢的任何形式。

于 2008-11-11T01:20:47.280 回答
1

冒着在 SO 上引发混乱的风险,我建议如果表格的格式永远不会改变,你可以使用正则表达式来解析和捕获你需要的内容。

于 2011-01-31T12:30:26.427 回答