2009-07-06 32 views
1

第一關HTML行看起來是這樣的:解析HTML行到CSV

<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文件。請幫忙或我的顯示器最終被錘擊。

+0

btw感謝MYYN的幫助b4。我放棄了,現在我回來了(希望)更清晰的更具體的問題。 – northnodewolf 2009-07-06 09:53:03

+0

要顯示代碼縮進它4個空格,它會自動爲你逃脫。 – 2009-07-06 09:53:21

回答

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

看起來很好,BeautifulSoup對此很有用(儘管我個人傾向於使用lxml)。你應該能夠獲得你獲得的數據,並使csv文件沒有任何明顯的問題使用csv模塊...

我認爲你需要真正告訴我們是什麼問題。 「它仍然不起作用」不是問題描述。

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") }) 
+0

@它看起來應該是這樣的: soup = BeautifulSoup(open(filename,「r」)) - 感謝我改變了它 – northnodewolf 2009-07-06 12:57:34