【问题标题】:UnicodeEncodeError: Scraping data using Python and beautifulsoup4UnicodeEncodeError:使用 Python 和 beautifulsoup4 抓取数据
【发布时间】:2015-06-27 17:34:55
【问题描述】:

我正在尝试从 PGA 网站上抓取数据以获取美国所有高尔夫球场的列表。我想抓取数据并输入到 CSV 文件中。我的问题是在运行我的脚本后出现此错误。谁能帮助解决此错误以及如何提取数据?

这是错误信息:

文件“/Users/AGB/Final_PGA2.py”,第 44 行,在
writer.writerow(行)

UnicodeEncodeError: 'ascii' codec can't encode character u'\u201c' in 位置 35:序数不在范围内(128)

下面的脚本;

import csv
import requests 
from bs4 import BeautifulSoup

courses_list = []
for i in range(906):      # Number of pages plus one 
    url = "http://www.pga.com/golf-courses/search?page={}&searchbox=Course+Name&searchbox_zip=ZIP&distance=50&price_range=0&course_type=both&has_events=0".format(i)
r = requests.get(url)
soup = BeautifulSoup(r.content)

g_data2=soup.find_all("div",{"class":"views-field-nothing"})

for item in g_data2:
    try:
          name = item.contents[1].find_all("div",{"class":"views-field-title"})[0].text
          print name
    except:
          name=''
    try:
          address1=item.contents[1].find_all("div",{"class":"views-field-address"})[0].text
    except:
          address1=''
    try:
          address2=item.contents[1].find_all("div",{"class":"views-field-city-state-zip"})[0].text
    except:
          address2=''
    try:
          website=item.contents[1].find_all("div",{"class":"views-field-website"})[0].text
    except:
          website=''   
    try:
          Phonenumber=item.contents[1].find_all("div",{"class":"views-field-work-phone"})[0].text
    except:
          Phonenumber=''      

    course=[name,address1,address2,website,Phonenumber]

    courses_list.append(course)


with open ('PGA_Final.csv','a') as file:
          writer=csv.writer(file)
          for row in courses_list:
               writer.writerow(row)

【问题讨论】:

  • 您可以编辑您的帖子以正确显示吗?如果您将整个内容缩进 4 个空格,它将显示为代码块而不是未格式化的文本。
  • 我编辑了帖子,等待批准。
  • 你的代码有很多问题: 0。缩进在Python中很重要,检查requests.get(url)第1行。不要使用裸except:,它可能会捕获太多并隐藏错误,添加错误记录调试 2. 避免重复代码,而是创建一个函数。 3. 确保你知道你使用的 Python 版本:你不应该在 Python 3 上看到这个错误

标签: python csv unicode beautifulsoup scrape


【解决方案1】:

您不应该在 Python 3 上遇到该错误。这里的代码示例修复了您的代码中的一些不相关问题。它解析给定网页上的指定字段并将它们保存为 csv:

#!/usr/bin/env python3
import csv
from urllib.request import urlopen
import bs4 # $ pip install beautifulsoup4

page = 905
url = ("http://www.pga.com/golf-courses/search?page=" + str(page) +
       "&searchbox=Course+Name&searchbox_zip=ZIP&distance=50&price_range=0"
       "&course_type=both&has_events=0")
with urlopen(url) as response:
    field_content = bs4.SoupStrainer('div', 'views-field-nothing')
    soup = bs4.BeautifulSoup(response, parse_only=field_content)

fields = [bs4.SoupStrainer('div', 'views-field-' + suffix)
          for suffix in ['title', 'address', 'city-state-zip', 'website', 'work-phone']]

def get_text(tag, default=''):
    return tag.get_text().strip() if tag is not None else default

with open('pga.csv', 'w', newline='') as output_file:
    writer = csv.writer(output_file)
    for div in soup.find_all(field_content):
        writer.writerow([get_text(div.find(field)) for field in fields])

【讨论】:

    【解决方案2】:
    with open ('PGA_Final.csv','a') as file:
              writer=csv.writer(file)
              for row in courses_list:
                   writer.writerow(row)
    

    将其更改为:

    with open ('PGA_Final.csv','a') as file:
              writer=csv.writer(file)
              for row in courses_list:
                   writer.writerow(row.encode('utf-8'))
    

    或者:

    import codecs
    ....
    with codecs.open('PGA_Final.csv','a', encoding='utf-8') as file:
              writer=csv.writer(file)
              for row in courses_list:
                   writer.writerow(row)
    

    【讨论】:

    • 您也可以使用codecs.open,它的工作方式类似于普通的open,但也接受encoding kwarg。
    • 我根据您的建议添加了另一个解决方案。
    • AttributeError: 'list' object has no attribute 'encode' for the first option
    • 有什么建议可以解决这个问题吗?
    • 我有import codes 而不是import codecs,应该可以解决问题。第二个错误是因为row 是它自己的另一个列表,因此您还必须为它创建一个循环。我不知道,因为您没有数据样本。
    猜你喜欢
    • 2020-09-26
    • 2015-09-16
    • 1970-01-01
    • 2015-09-14
    • 2015-01-09
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多