Python Web Scraping:如何使用Try / Except来处理缺失值

时间:2018-02-05 23:13:38

标签: python pandas dataframe web-scraping try-except

我正在尝试使用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请求。有没有人知道如何解决这个问题?感谢。

2 个答案:

答案 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个链接?