我试图从https://www.prisonstudies.org/中抓取并保存有关监狱人口和监狱人口比率的数据。这些数据在特定国家的页面中报告,例如https://www.prisonstudies.org/country/italy。
我必须在一个.csv文件中写下刮取的数据(针对所有国家)。这应该包含4列:国家名称,年份,监狱人口总数,监狱人口日期
我已经做到了一定程度,但我对剩下的部分有点困惑。
预期输出示例:国家名称,年份,监狱总人口,监狱人口日期Algeria,2000,33. 992,108 Algeria,2003,39. 806,122 Algeria,2004,44. 231,134
下面是我的代码:
import requests
import elementpath
from xml.etree import ElementTree as ET
from bs4 import BeautifulSoup
from os.path import basename, dirname,abspath
url = "https://www.prisonstudies.org/world-prison-brief-data"
def parseCountries(url):
r = requests.get(url)
soup = ET.parse(r.text, 'lxml')
regions = soup.findAll('div', {'class' : 'item-list'})
out = {}
for reg in regions:
items = reg.findAll('a', href=True)
for i in items:
if i.text.strip() != '':
out[i.text.strip()] = i['href']
return(out)
def yearTableParser(countryUrl, countryName):
r = requests.get(countryUrl)
soup = BeautifulSoup(r.text, 'lxml')
yearTab = soup.find('table', {'id':'views-aggregator-datatable'})
out = []
if yearTab is not None:
rows = yearTab.findAll('tr')
for r in rows:
dat = r.findAll('td')
if dat != []:
out.append([countryName, dat[0].text.strip(),dat[1].text.replace('c','').replace(',','.').strip(),dat[2].text.replace('c','').replace(',','.').strip()])
return(out)
2条答案
按热度按时间qrjkbowd1#
这是一个简化的答案,只解决了从页面中提取所需数据的问题。然后您可以将数据添加到您的csv等。
最后一个列名应该是
Prison Population Rate
,而不是...Date
。以摩洛哥为例,产出将是:
等等的。
p5fdfcr12#
我没有经验与网页报废,但我玩了一点与此页面:从@Jack Fleeting的想法中,我得到了这个结果:
代码:
阿尔及利亚的输出,我运行的不是所有页面,但它应该是一样的: