2017-08-14 112 views
-2

原諒業餘代碼,我敢肯定,看看有經驗的人是痛苦的。相同的HTML代碼讀取不同使用python

我想寫一些代碼,能夠保存所有數據從以下鏈接: http://pq.gov.mt/pqweb.nsf/bysitting?openview,並將它們保存在一個易於搜索的CSV文件。

我寫的代碼似乎工作正常,因爲它設法將我需要的所有信息保存在csv文件的不同列中。但是,當它達到一個問題時,它會全部崩潰,412頁:http://pq.gov.mt/PQWeb.nsf/bysitting!OpenView&Start=1&Count=20&Expand=9#9,由於某種原因,它無法註冊最後一個條目(標有箭頭< < < < < < -----)。

據我所知,頁面的html與其餘的完全相同,這似乎工作正常,所以我不能真正瞭解如何或爲什麼它是不同的。

不知道我已經解釋了我的問題,但如果有必要,我會很樂意詳細說明。

在此先感謝。下面

for item in html_search_1: 
    x = item.find_all('a',href = True) 

    for t in x: 
     store = [] 
     y = t.get('href') 
     new_url = ("http://pq.gov.mt"+y) 
     page_2 = urllib.request.urlopen(new_url).read() 
     soup_2 = BeautifulSoup(page_2, 'html.parser') 
     html_search_3 = soup_2.find_all("div", class_ = "col-md-10") 
     for ccc in html_search_3: 
      html_search_4 = ccc.find_all("div", class_ = "row") 
      for haga in html_search_4: 
        z = haga.find_all("div", class_ = ["col-md-2","col-md-4","col-md-12","col-md-10"]) 

        for new_item in z: 
         store.append(new_item.text) 

    var0 = 1 
    var1 = 3 
    var2 = 5 
    var3 = 7 
    var4 = 9 
    var5 = 13 
    var6 = 14 
    var7 = 15 
    var8 = 17 
    count = 1 
    for o in range(1): 
     try: 

      legislature.append(store[var0]) 
      category.append(store[var1]) 
      question_number.append(store[var2]) 
      date.append(store[var3]) 
      sitting.append(store[var4]) 
      title.append(store[var5]) 
      MPs.append(store[var6]) 
      question.append(store[var7]) 
      print(store[var7]) 
      answer.append(store[var8]) 
      print(store[var8]) #<<<<<<<<<<<<<<<<<<<<-------------------- 


      var0 = var0 + 19 
      var1 = var1 + 19 
      var2 = var2 + 19 
      var3 = var3 + 19 
      var4 = var4 + 19 
      var5 = var5 + 19 
      var6 = var6 + 19 
      var7 = var7 + 19 
      var8 = var8 + 19 


     except: 
      pass 
+0

您每次通過'for t in x'循環設置'store = []''。所以它只包含'x'中最後一項的值。 – Barmar

+1

也許有一個例外:你可以'而不是'傳遞'來看看會發生什麼? – sal

回答

0

這是一個有趣的問題。花了我一段時間來掌握你的意圖,特別是因爲我對馬耳他語言的知識有限:-),但我想我得到了一個解決方案。沒關係業餘代碼,你試過了,你想到了這個問題。我的代碼也可能不會贏得贊助,但是我可以毫無問題地克服您的問題。

import requests 
from bs4 import BeautifulSoup 

div_index = {'legislature': (0, 'md4'), 
      'category': (1, 'md4'), 
      'qnumber': (2, 'md4'), 
      'qdate': (3, 'md4'), 
      'sitting': (4, 'md4'), 
      'title': (3, 'md10'), 
      'mps': (0, 'md12'), 
      'question': (1, 'md12'), 
      'answer': (3, 'md12')} 

def process_file(urlstring): 
    r = requests.get("http://pq.gov.mt/" + urlstring) 
    data = r.content 
    doc = BeautifulSoup(data, 'html.parser') 
    divs = {} 
    divs['md2'] = doc.find_all("div", class_ = ["col-md-2"]) 
    divs['md4'] = doc.find_all("div", class_ = ["col-md-4"]) 
    divs['md10'] = doc.find_all("div", class_ = ["col-md-10"]) 
    divs['md12'] = doc.find_all("div", class_ = ["col-md-12"]) 

    result = {} 
    for key, index in div_index.items(): 
     result[key] = divs[index[1]][index[0]].text 

    return result 


def main(): 
    r = requests.get('http://pq.gov.mt/PQWeb.nsf/bysitting!OpenView&Start=1&Count=20&Expand=9#9') 
    data = r.content 
    doc = BeautifulSoup(data, 'html.parser') 
    links = doc.find_all("a") 
    for link in links: 
     if 'href' in link.attrs and link.attrs['href'].find('!OpenDocument') > 0: 
      result = process_file(link.attrs['href']) 
      print(result) 

if __name__ == '__main__': 
    main() 

我做什麼,是第一家專賣店在字典中的每個領域的指標,用類div我感興趣的一起。之後,我groked頁面的結構,我發現它容易解析每個班級的清單。這樣就很容易找到數據(網頁抓取就是這樣的,如果他們改變頁面結構,你總是必須手動關注,所以這不是我關心的問題,但是有更多的可讀代碼)。

好處是,通過使用字典鍵和值的枚舉,我可以從我的原型代碼中刪除超過二十行。通過這種方式,代碼只是遍歷索引字典中的每個條目並檢索每個dic的文本。

我爲每個細節URL創建了一個函數,並稍微清理了代碼,並返回了一個字典以方便使用。如果要將MP的名稱分割爲單獨的行,則仍需在result['mps']上使用.split("\n")。希望這有助於...

+0

嗨,阿米紐斯,對不起,只是有機會看看這個。非常感謝你,這確實爲我節省了很多時間 - 懷疑我會管理。 代碼看起來好多了,不那麼麻煩,從它的外觀來看,我只需要添加幾行來保存到csv,我就完成了。再次感謝。 – YP41

+0

@ YP41謝謝,很高興我能幫上忙。您想將此標記爲接受的答案嗎? – Arminius

0

碼這不是一個答案,但無論如何,我會張貼:與

var0 = 1 
var1 = 3 
var2 = 5 

var0 += 19 
... 

您可以通過非常替換下面這句法減少你的代碼

import numpy as np 
index = np.array([1,3,5,7]) # we store indexes in a numpy array instead 
#index[0] = 1 

index += 19 # this will add 19 to all elements creating [20,22,24,26] 
#cols[0] = 20 
相關問題