将HTML行解析为CSV

时间:2009-07-06 09:50:25

标签: python html csv screen-scraping beautifulsoup

首先关闭html行如下:

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

我会显示真正的HTML,但我很遗憾地说不知道如何阻止它。 感到羞耻

使用BeautifulSoup(Python)或任何其他推荐的Screen Scraping / Parsing方法我想将同一目录中的大约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文件。请帮忙,否则我的显示器最终会受到锤击。

3 个答案:

答案 0 :(得分: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") })

答案 1 :(得分: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 :(得分:2)

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

我认为您需要实际告诉我们问题所在。 “它仍然不起作用”不是问题描述。