将多个html文件刮制为CSV

时间:2009-05-28 21:34:57

标签: python sqlite screen-scraping beautifulsoup mechanize

我正在尝试从我硬盘上的1200多个.htm文件中删除行。在我的电脑上,他们在这里'file:///home/phi/Data/NHL/pl07-08/PL020001.HTM'。这些.htm文件从* 20001.htm顺序到* 21230.htm。我的计划是最终通过电子表格应用程序在MySQL或SQLite中输入我的数据,或者如果我能从此过程中获得干净的.csv文件,则直接将其输入。

这是我第一次尝试代码(Python),抓取,我刚刚在糟糕的pentium IV上安装了Ubuntu 9.04。不用说我是新手并且有一些障碍。

如何让mechanize按顺序浏览目录中的所有文件。机械化甚至可以这样做吗?机械化/ Python / BeautifulSoup可以读取'file:///'样式的url还是有另一种方法可以将它指向/home/phi/Data/NHL/pl07-08/PL020001.HTM?以100或250个文件为增量执行此操作是否明智,或者只发送所有1230?

我只需要以“<tr class="evenColor">”开头的行,并以“</tr>”结尾。理想情况下,我只想要包含“SHOT”|“MISS”|“GOAL”的行,但我想要整行(每列)。请注意,“目标”是粗体,所以我必须指定它吗?每个htm文件有3个表。

此外,我希望父文件(pl020001.htm)的名称包含在我抓取的行中,以便我可以在最终数据库的自己的列中标识它们。我甚至不知道从哪里开始。这就是我到目前为止所做的:

#/usr/bin/python
from BeautifulSoup import BeautifulSoup
import re
from mechanize import Browser

mech = Browser()
url = "file:///home/phi/Data/NHL/pl07-08/PL020001.HTM"
##but how do I do multiple urls/files? PL02*.HTM?
page = mech.open(url)

html = page.read()
soup = BeautifulSoup(html)
##this confuses me and seems redundant
pl = open("input_file.html","r")
chances = open("chancesforsql.csv,"w")

table = soup.find("table", border=0)
for row in table.findAll 'tr class="evenColor"'
#should I do this instead of before?
outfile = open("shooting.csv", "w")

##how do I end it?

我应该使用IDLE还是类似的东西?只是在Ubuntu 9.04的终端?

2 个答案:

答案 0 :(得分:1)

你不需要机械化。由于我不完全了解HTML内容,因此我首先尝试查看匹配的内容。像这样:

import glob
from BeautifulSoup import BeautifulSoup

for filename in glob.glob('/home/phi/Data/*.htm'):
    soup = BeautifulSoup(open(filename, "r").read()) # assuming some HTML
    for a_tr in soup.findAll("tr", attrs={ "class" : "evenColor" }):
        print a_tr

然后选择你想要的东西并用逗号将其写入stdout(并将其重定向到一个文件)。或者通过python编写csv。

答案 1 :(得分:0)

MYYN的回答对我来说似乎是一个很好的开始。有一件事我会指出我运气好的是:

import glob
    for file_name in glob.glob('/home/phi/Data/*.htm'):
        #read the file and then parse with BeautifulSoup

我发现osglob导入对于运行目录中的文件非常有用。

此外,一旦您以这种方式使用for循环,您就可以修改file_name以便在输出文件中使用,以便输出文件名与输入文件名匹配。