使用python

时间:2017-08-14 20:36:40

标签: python html csv

原谅业余代码,我相信任何有经验的人都会感到痛苦。

我正在尝试编写一些能够从以下链接保存所有数据的代码:  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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这是一个有趣的问题。花了一些时间来掌握你的意图,特别是因为我对Maltesian语言的了解有限:-),但我想我得到了一个解决方案。没关系业余代码,你试过,你想过这个问题。我的代码也可能不会赢得广告,但我会毫无问题地解决您的问题 412

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类。在我弄清楚页面的结构后,我发现它更容易解析每个班级的清单。这样就很容易找到数据(网页抓取就是这样,如果他们改变了页面结构,你总是需要手动跟踪,所以这对我来说不是一个问题,但是有一个更易读的代码)。

优点是通过使用dict键和值的枚举,我可以从原型代码中删除超过24行。这样代码就会循环遍历索引dict中的每个条目,并检索每个dic的文本。

我为每个细节URL创建了一个函数并稍微清理了代码,并为方便起见返回了一个字典。如果您想将MP的名称拆分为单独的行,您仍然必须使用.split("\n")上的result['mps']。希望有所帮助...