将HTML行解析为CSV
首先,HTML的行看起来是这样的:
<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文件。请帮帮我,不然我的显示器就要被我砸了。
3 个回答
这看起来没问题,BeautifulSoup在这方面很有用(不过我个人更喜欢用lxml)。你应该可以把得到的数据用csv模块做成一个csv文件,应该不会有什么明显的问题……
我觉得你需要告诉我们具体的问题是什么。“它还是不工作”并不是一个清楚的问题描述。
你没有详细说明你遇到的问题 - 到底哪里不对劲呢?
下面这一行可能就是你的问题所在:
soup = BeautifulSoup(open(filename["r"]))
在我看来,这里应该是:
soup = BeautifulSoup(open(filename, "r"))
接下来这一行:
for row in soup.findAll("tr", attrs={ "class" : "evenColor" })
看起来只会选出偶数行(假设你的偶数行有'class'为'evenColor',而奇数行有'class'为'oddColor')。如果你想要选出所有'class'为'evenColor'或'oddColor'的行,可以使用正则表达式来匹配这个'class'值:
for row in soup.findAll("tr", attrs={ "class" : re.compile(r"evenColor|oddColor") })
你需要通过在文件顶部添加 import csv
来导入 csv模块。
接下来,你需要在处理每一行数据的循环外创建一个csv文件,像这样:
writer = csv.writer(open("%s.csv" % filename, "wb"))
然后,你需要在循环中从html行中提取数据,类似于:
values = (td.fetchText() for td in row)
writer.writerow(values)