将多个HTML文件抓取到CSV

2 投票
2 回答
2980 浏览
提问于 2025-04-15 11:54

我想从我硬盘上的1200多个.htm文件中提取数据。这些文件在我电脑上的路径是 'file:///home/phi/Data/NHL/pl07-08/PL020001.HTM'。这些.htm文件是按顺序排列的,从 *20001.htm 到 *21230.htm。我的计划是最终把这些数据放到MySQL或SQLite数据库中,可能会通过电子表格应用程序来处理,或者如果能直接得到一个干净的.csv文件就更好了。

这是我第一次尝试写代码(用Python),也是第一次做数据抓取,我刚在我的老旧的奔腾IV电脑上安装了Ubuntu 9.04。可以说我还是个新手,遇到了一些问题。

我该如何让mechanize按顺序处理目录中的所有文件?mechanize能做到这一点吗?mechanize/Python/BeautifulSoup能读取 'file:///' 这种格式的链接吗?还是说有其他方法可以指向 /home/phi/Data/NHL/pl07-08/PL020001.HTM?一次处理100个还是250个文件比较好,还是直接处理全部1230个文件?

我只需要那些以 "<tr class="evenColor">" 开头,以 "</tr>" 结尾的行。理想情况下,我只想要包含 "SHOT"、"MISS" 或 "GOAL" 的行,但我想要整行(每一列)。注意 "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

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,可以对它进行修改,以便在输出文件中使用,这样输出的文件名就能和输入的文件名对应上。

1

你不需要用到 mechanize。因为我不太清楚具体的 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

然后选择你想要的内容,用逗号把它们写到标准输出上(并且可以把它重定向到一个文件里)。或者你也可以用 Python 来写一个 CSV 文件。

撰写回答