2016-04-24 177 views
0

希望有人可以通過webscrape幫助我。它在去年每天都工作得很好,在冬天關掉它,現在頁面上的東西發生了變化,它不再有效。 我需要爲列出的每個站點提取危險等級代碼。去年,BS尋找「tr」標籤,它的工作非常完美。我很難過。蟒蛇網刮失敗

下面是一個樣本區域的部位:http://bcwildfire.ca/hprScripts/DgrCls/index.asp?Region=4

這裏是我的代碼達至BS做它的事:

from urllib import urlopen 
from HTMLParser import HTMLParser 
import string, datetime, sys 
from bs4 import BeautifulSoup 

# Fire Danger ratings by station start at index 4 

class HTMLCleaner(HTMLParser): 
    container = "" 
    def handle_data(self, data): 
     self.container = self.container + "," + data 
     return self.container 

todayChk = datetime.date.today().strftime("%d-%b-%Y") 

##FireRegions = {'Prince George': '4', 'Northwest': '3', 'Cariboo': '7', 'Kamloops': '5', 'Southeast': '6'} 
FireRegions = {'Prince George': '4'} 

Regs = FireRegions.keys() 
Reg = 0 

while Reg < len(FireRegions): 
    print Regs[Reg] + " Region" 
    content = urlopen('http://bcwildfire.ca/hprScripts/DgrCls/index.asp?Region='+FireRegions[Regs[Reg]]).read() 
    soup = BeautifulSoup(content, 'html.parser') 
    PGStats = soup.body.find_all("tr") 
    print PGStats 
    Reg+=1 

感謝這麼多,如果你能提供一個解決方案。

+1

*「頁面上的內容發生了變化」* - 您是否試圖弄清楚*什麼*? – jonrsharpe

+0

我感覺像'FireRegions.keys()'中的reg行似乎比while循環後面跟着'FireRegions [Regs [Reg]]' –

+0

更乾淨我對BS模塊不太瞭解。我花了幾個小時試圖到達我所需要的數據表,但沒有運氣。該頁面與去年幾乎一樣,看不到任何不同。 –

回答

2

看起來像問題是因爲頁面上的額外tabletr元素。您需要將搜索範圍縮小至特定的table,並在其中添加電臺和評分。

的一個選擇,因爲有我們可以用它來區分他人所需的表沒有idclass屬性,將通過文本找到一個表頭,然後go up to the parent table element

table = soup.find(text="[Dgr Rgn] Station").find_parent("table") 
for row in table.find_all("tr")[1:]: 
    cells = row.find_all("td") 
    print(cells[0].get_text(), cells[1].get_text()) 

打印:

(u'[1] BEAR LAKE', u'3') 
(u'[1] BEDNESTI', u'3') 
(u'[1] CHETWYND (EC)', u'4') 
... 
(u'[1] VALEMOUNT HUB', u'4') 
(u'[1] VANDERHOOF HUB', u'4') 
(u'[1] WONOWON', u'4') 
+0

哦,哇,這正是我需要的,非常感謝!我會試試看。 –