我正在尝试从硬盘驱动器上的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。不用说我是新手,有一些障碍。
我如何机械化按顺序浏览目录中的所有文件。可以机械化吗?机械化/ Python / BeautifulSoup可以读取'file:///'样式的URL还是有其他方法将其指向/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中的Terminal?
最佳答案
您不需要机械化。由于我不完全了解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。
关于python - 将多个HTML文件抓取为CSV,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/923318/