【问题标题】:CSV not writing properly after scraping data for a website using Python and BeautifulSoup使用 Python 和 BeautifulSoup 为网站抓取数据后 CSV 无法正确写入
【发布时间】:2015-09-26 19:13:31
【问题描述】:

从网站抓取数据后,我在写入 CSV 文件时遇到问题。我的目标是抓取在美国发现的高尔夫球场的名称和地址列表。我使用.get_text(separator=' ') 作为地址来删除<Br> 来分解地址的文本,但是当写入CSV 时,我只能从我的893 交互中获得三个条目。我该怎么做才能正确抓取的数据量以及如何修复我的脚本以便正确抓取所有内容。

这是我的脚本:

import csv
import requests
from bs4 import BeautifulSoup

courses_list = []

for i in range(893): #893
    url="http://sites.garmin.com/clsearch/courses/search?course=&location=&country=US&state=&holes=&radius=&lang=en&search_submitted=1&per_page={}".format(i*20)
    r = requests.get(url)
    soup = BeautifulSoup(r.text)
    g_data2 = soup.find_all("div",{"class":"result"})
    #print g_data

    for item in g_data2:
        try:
            name = item.find_all("div",{"class":"name"})[0].text
        except:
            name=''
            print "No Name found!"
        try:
            address= item.find_all("div",{"class":"location"})[0].get_text(separator=' ')
            print address
        except:
            address=''
            print "No Address found!"

course=[name,address]
courses_list.append(course)

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

【问题讨论】:

    标签: python csv web-scraping beautifulsoup


    【解决方案1】:

    如果那是你的缩进,那么它是错误的,你需要在循环中添加名称和地址,这应该添加所有数据:

    import csv
    import requests
    from bs4 import BeautifulSoup
    
    courses_list = []
    with open('Garmin_GC.csv', 'w') as file:
        for i in range(893):  #893
            url = "http://sites.garmin.com/clsearch/courses/search?course=&location=&country=US&state=&holes=&radius=&lang=en&search_submitted=1&per_page={}".format(
                i * 20)
            r = requests.get(url)
            soup = BeautifulSoup(r.text)
            g_data2 = soup.find_all("div", {"class": "result"})
            for item in g_data2:
                try:
                    name = item.find_all("div", {"class": "name"})[0].text
                except IndexError::
                    name = ''
                    print "No Name found!"
                try:
    
                    address = item.find_all("div", {"class": "location"})[0].get_text(separator=' ')
                    print address
                except IndexError::
                    address = ''
                    print "No Address found!"
                course = [name, address]
                courses_list.append(course)
    
    
        writer = csv.writer(file)
        for row in courses_list:
            writer.writerow([s.encode("utf-8") for s in row])
    

    您可以在循环外打开文件并在完成后写入一次,如果您不想将所有数据存储在列表中,只需编写每次迭代:

    with open('Garmin_GC.csv', 'w') as file:
        writer = csv.writer(file)
        for i in range(3):  #893
            url = "http://sites.garmin.com/clsearch/courses/search?course=&location=&country=US&state=&holes=&radius=&lang=en&search_submitted=1&per_page={}".format(
                i * 20)
            r = requests.get(url)
            soup = BeautifulSoup(r.text)
            g_data2 = soup.find_all("div", {"class": "result"})
            for item in g_data2:
                try:
                    name = item.find_all("div", {"class": "name"})[0].text
                except IndexError:
                    name = ''
                    print "No Name found!"
                try:    
                    address = item.find_all("div", {"class": "location"})[0].get_text(separator=' ')
                    print address
                except IndexError:
                    address = ''
                    print "No Address found!"
                writer.writerow([name.encode("utf-8"), address.encode("utf-8")])
    

    如果您没有姓名或地址,那么您可能需要在例外中添加continue,如果您想忽略缺少其中一个或两个的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-26
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      • 1970-01-01
      • 2021-10-26
      相关资源
      最近更新 更多