Python Web Scraping:如何使用 Try/Except 处理缺失值
Python Web Scraping: How to use Try/Except to handle missing values
我正在尝试使用 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 请求。有没有人知道如何解决这个问题?谢谢。
一点:强烈建议将数据保存在本地,这样可以处理解析错误,而无需诉诸多次请求。
# 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)
如果没有什么可附加的,那为什么要附加None?也许是这样的?
try:
some_logic()
except:
pass #or print or log to a file to review later.
那么你的数据框中就不会有垃圾。您在 Pandas 中的具体错误是什么?
根据您的描述,问题似乎是您没有向网站列表中添加足够的项目。您可以使用此数组初始化器创建一个大小为 5 的空列表:
websites = [None] * 5
这将生成一个仅
的列表
[None, None, None, None, None]
您还必须实际将其附加到您的网站列表中,您在当前的 except 语句中没有这样做,因此您的 try except 看起来像
try:
place_web = place_data.a['href']
websites.append(place_web)
except Exception as e:
place_web = [None] * 5
websites.append(place_web)
这也有点假设网站列表的大小始终相同,是这样吗?即如果它没有失败,它总是有 6 个链接?
我正在尝试使用 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 请求。有没有人知道如何解决这个问题?谢谢。
一点:强烈建议将数据保存在本地,这样可以处理解析错误,而无需诉诸多次请求。
# 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)
如果没有什么可附加的,那为什么要附加None?也许是这样的?
try:
some_logic()
except:
pass #or print or log to a file to review later.
那么你的数据框中就不会有垃圾。您在 Pandas 中的具体错误是什么?
根据您的描述,问题似乎是您没有向网站列表中添加足够的项目。您可以使用此数组初始化器创建一个大小为 5 的空列表:
websites = [None] * 5
这将生成一个仅
的列表[None, None, None, None, None]
您还必须实际将其附加到您的网站列表中,您在当前的 except 语句中没有这样做,因此您的 try except 看起来像
try:
place_web = place_data.a['href']
websites.append(place_web)
except Exception as e:
place_web = [None] * 5
websites.append(place_web)
这也有点假设网站列表的大小始终相同,是这样吗?即如果它没有失败,它总是有 6 个链接?