将HTML表保存到数据库
我正在尝试抓取html表并将其数据保存在数据库中。我们发现什么策略/解决方案对实施此计划有帮助。
我对Java和PHP最为满意,但实际上任何语言的解决方案都将有所帮助。
编辑:有关更多详细信息,UTA(盐湖巴士系统)在其网站上提供了公交车时刻表。每个时间表都显示在一个表中,该表的标题和时间分别在行中和行中。我想检查一下时间表,然后以一种可以查询的形式将信息保存在表中。
这是时间表的起点
解决方案
回答
关于这一主题有一本不错的书:Kevin Hemenway和Tara Calishain撰写的Spidering Hacks。
回答
这完全取决于我们要抓取的HTML的正确程度?如果它是有效的XHTML,则只需在其上使用一些XPath查询即可获取所需的内容。
php中的xpath示例:http://blogoscoped.com/archive/2004_06_23_index.html#108802750834787821
一个帮助程序类,用于将表刮入数组:http://www.tgreer.com/class_http_php.html
回答
我以前尝试过进行屏幕抓取,但是发现它非常脆弱,尤其是对于动态生成的代码。
我找到了一个第三方DOM分析器,并使用它来使用类似于Regex的匹配模式来导航源代码,以查找所需的数据。
我建议尝试找出该站点的所有者是否具有发布的API(通常是Web服务)以从其系统中检索数据。如果没有,那就祝你好运。
回答
我发现脚本语言通常更适合执行此类任务。我个人更喜欢Python,但是PHP也可以使用。在Java中对字符串进行切碎,切碎和解析是太多的工作。
回答
使用Perl和以下CPAN模块,这将是最简单的:
- http://metacpan.org/pod/HTML::Parser
- http://metacpan.org/pod/LWP
- http://metacpan.org/pod/DBD/mysql
- http://metacpan.org/pod/DBI.pm
CPAN是Perl模块的主要分发机制,例如,可以通过运行以下shell命令来访问CPAN:
cpan HTML :: Parser
如果我们使用的是Windows,事情将会变得更加有趣,但是我们仍然可以这样做:http://www.perlmonks.org/?node_id=583586
回答
pianohacker忽略了HTML :: TableExtract模块,该模块正是为这种事情而设计的。我们仍然需要LWP来检索表。
回答
如果我们想要的是一个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()
一旦以这种形式获取数据,就可以将数据转换为我们喜欢的任何形式。