我正在尝试使用Try / Except来处理潜在的缺失值,因为我搜索了包含餐馆数据的URL列表。为了制作一个pandas DataFrame,我需要每个列表具有相同的长度。
我正在尝试将缺失的值编码为None或其他一些可识别的形式。目前,websites
列表长度为71,其他列表为76.错误为:ValueError: arrays must all be same length
。
刮痧代码(参见Try / Except部分):
# Initialize lists
names = []
addresses = []
zip_codes = []
websites = []
# Scrape through list of urls
for link in url_list:
r = requests.get(link).text
soup = BeautifulSoup(r, 'lxml')
place_name = soup.find('h1').text
names.append(place_name)
place_data = soup.find('h6')
place_address = place_data.text.split(',')[0]
addresses.append(place_address)
place_zip = place_data.text.split(',')[1][1:5]
zip_codes.append(place_zip)
# Replace missing value with None
try:
place_web = place_data.a['href']
websites.append(place_web)
except Exception as e:
place_web = None
当我想创建一个像这样的DataFrame时,我基本上会遇到错误:
restaurant_data = pd.DataFrame({'name' : names,
'address' : addresses,
'zip_code' : zip_codes,
'website' : websites})
我也尝试将None更改为类似'NA'的字符串,但错误占了上风。我不想继续无休止地发送GET请求。有没有人知道如何解决这个问题?感谢。
答案 0 :(得分:0)
有一点:高度建议在本地保存数据,这样就可以处理解析错误,而无需采取多种请求。
# Some code to loop over URLS
response = requests.get(url, headers=headers )
with open('some_pattern_{}.{}'.format(x, 'html'), 'w') as f:
f.write(response.text)
如果没有什么要追加的话,为什么要附加无?也许是这样的?
try:
some_logic()
except:
pass #or print or log to a file to review later.
然后你的数据框中没有垃圾邮件。您在Pandas中的具体错误是什么?
答案 1 :(得分:0)
从您的描述看来,问题是您没有在网站列表中添加足够的项目。您可以使用此数组initalizer创建一个大小为5的空列表:
websites = [None] * 5
将生成一个只是
的列表[None, None, None, None, None]
你还必须将它实际附加到你的网站列表中,而你当前的除外声明中没有这样做,所以你的尝试除了看起来像
try:
place_web = place_data.a['href']
websites.append(place_web)
except Exception as e:
place_web = [None] * 5
websites.append(place_web)
这也有点假设网站列表总是大小相同,是这样吗?即如果它没有失败,它将始终有6个链接?