2009-07-06 65 views
1

第一关HTML行看起来是这样的:解析HTML行到CSV

<tr class="evenColor"> blahblah TheTextIneed blahblah and ends with </tr> 

我会展示真实的HTML,但我很抱歉地说,不知道如何阻止它。 感觉羞耻

使用BeautifulSoup(Python)或任何其它建议的屏幕抓取/解析方法我想约1200个.htm文件输出在同一目录成CSV格式。这最终将进入SQL数据库。每个目录代表一年,我计划至少做5年。

我一直在用glob作为从一些建议做到这一点的最佳方式。这就是我迄今为止所做的,并且陷入了僵局。

import glob 
from BeautifulSoup import BeautifulSoup 

for filename in glob.glob('/home/phi/data/NHL/pl0708/pl02*.htm'): 
#these files go from pl020001.htm to pl021230.htm sequentially 
    soup = BeautifulSoup(open(filename["r"])) 
    for row in soup.findAll("tr", attrs={ "class" : "evenColor" }) 

我意识到这是丑陋的,但这是我第一次尝试这样的事情。这个问题花了我好几个月的时间才意识到,我不需要手动将数千个文件复制并粘贴到Excel中。我也意识到,我可以从挫折中重复踢我的电脑,它仍然有效(不推荐)。我越来越接近,我需要知道下一步做什么,以使这些CSV文件。请帮忙或我的显示器最终被锤击。

+0

btw感谢MYYN的帮助b4。我放弃了,现在我回来了(希望)更清晰的更具体的问题。 – northnodewolf 2009-07-06 09:53:03

+0

要显示代码缩进它4个空格,它会自动为你逃脱。 – 2009-07-06 09:53:21

回答

4

您需要通过添加import csv到文件的顶部导入csv module

然后,你需要一些东西来创建一个CSV文件,你行的循环之外,像这样:

writer = csv.writer(open("%s.csv" % filename, "wb")) 

然后,你需要真正拉出来的数据的HTML行的你的循环,类似到

values = (td.fetchText() for td in row) 
writer.writerow(values) 
2

看起来很好,BeautifulSoup对此很有用(尽管我个人倾向于使用lxml)。你应该能够获得你获得的数据,并使csv文件没有任何明显的问题使用csv模块...

我认为你需要真正告诉我们是什么问题。 “它仍然不起作用”不是问题描述。

4

你并没有真正解释你为什么被卡住 - 有什么不完全工作?

下面这行很可能是你的问题:

soup = BeautifulSoup(open(filename["r"])) 

它看起来对我来说,这应该是:

soup = BeautifulSoup(open(filename, "r")) 

以下行:

for row in soup.findAll("tr", attrs={ "class" : "evenColor" }) 

看起来只会选出偶数行(假设你的偶数行有'evenColor'类,奇数行有'oddColor')。假设你想用一个类或者evenColor或oddColor的所有行,你可以使用正则表达式匹配类值:

for row in soup.findAll("tr", attrs={ "class" : re.compile(r"evenColor|oddColor") }) 
+0

@它看起来应该是这样的: soup = BeautifulSoup(open(filename,“r”)) - 感谢我改变了它 – northnodewolf 2009-07-06 12:57:34