原谅业余代码,我相信任何有经验的人都会感到痛苦。
我正在尝试编写一些能够从以下链接保存所有数据的代码: 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 :(得分: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']
。希望有所帮助...