使用Python和Beautifulsoup4从网页抓取数据并写入保存为CSV文件

6
我正在尝试从PGA.com网站上获取所有美国高尔夫球场的表格数据。在我的CSV表格中,我想包括高尔夫球场的名称、地址、所有权、网址和电话号码。使用这些数据,我想进行地理编码,并在地图上放置一个本地副本到我的电脑。
我使用Python和Beautiful Soup4来提取我的数据。我已经成功从网站提取了数据,但是我在编写将数据导出到CSV文件并显示所需参数的脚本方面遇到了困难。
以下是我的脚本。我需要帮助创建代码,以将提取的代码转换为CSV文件,并将其保存到我的桌面。
以下是我的脚本:
import csv
import requests 
from bs4 import BeautifulSoup
url = "http://www.pga.com/golf-courses/search?searchbox=Course+Name&searchbox_zip=ZIP&distance=50&price_range=0&course_type=both&has_events=0"
r = requests.get(url)

soup = BeautifulSoup(r.content)

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


for item in g_data1:
     try:
          print item.contents[1].find_all("div",{"class":"views-field-counter"})[0].text
     except:
          pass  
     try:
          print item.contents[1].find_all("div",{"class":"views-field-course-type"})[0].text
     except:
          pass

for item in g_data2:
   try:
      print item.contents[1].find_all("div",{"class":"views-field-title"})[0].text
   except:
      pass
   try:
      print item.contents[1].find_all("div",{"class":"views-field-address"})[0].text
   except:
      pass
   try:
      print item.contents[1].find_all("div",{"class":"views-field-city-state-zip"})[0].text
   except:
      pass

这是我运行脚本时目前得到的结果。我想将这些数据制作成 CSV 表格,以便稍后进行地理编码。
1801 Merrimac Trl
Williamsburg, Virginia 23185-5905

12551 Glades Rd
Boca Raton, Florida 33498-6830
Preserve Golf Club 
13601 SW 115th Ave
Dunnellon, Florida 34432-5621
1000 Acres Ranch Resort 
465 Warrensburg Rd
Stony Creek, New York 12878-1613
1757 Golf Club 
45120 Waxpool Rd
Dulles, Virginia 20166-6923
27 Pines Golf Course 
5611 Silverdale Rd
Sturgeon Bay, Wisconsin 54235-8308
3 Creek Ranch Golf Club 
2625 S Park Loop Rd
Jackson, Wyoming 83001-9473
3 Lakes Golf Course 
6700 Saltsburg Rd
Pittsburgh, Pennsylvania 15235-2130
3 Par At Four Points 
8110 Aero Dr
San Diego, California 92123-1715
3 Parks Fairways 
3841 N Florence Blvd
Florence, Arizona 85132
3-30 Golf & Country Club 
101 Country Club Lane
Lowden, Iowa 52255
401 Par Golf 
5715 Fayetteville Rd
Raleigh, North Carolina 27603-4525
93 Golf Ranch 
406 E 200 S
Jerome, Idaho 83338-6731
A 1 Golf Center 
1805 East Highway 30
Rockwall, Texas 75087
A H Blank Municipal Course 
808 County Line Rd
Des Moines, Iowa 50320-6706
A-Bar-A Ranch Golf Course 
Highway 230
Encampment, Wyoming 82325
A-Ga-Ming Golf Resort, Sundance 
627 Ag A Ming Dr
Kewadin, Michigan 49648-9397
A-Ga-Ming Golf Resort, Torch 
627 Ag A Ming Dr
Kewadin, Michigan 49648-9397
A. C. Read Golf Club, Bayou 
Bldg 3495, Nas Pensacola
Pensacola, Florida 32508
A. C. Read Golf Club, Bayview 
Bldg 3495, Nas Pensacola
Pensacola, Florida 32508

g_data1和g_data2有什么区别?我似乎找不到它们在输出中的变化。 - evamvid
这将是views-field-nothing-1和views-field-nothing之间的区别。 - evamvid
据我所知,views-field-nothing-1 div 包含了图片... - evamvid
没关系,我搞定了。 - evamvid
2个回答

6
您只需要将输出放在列表中,然后使用CSV库进行导出。我不是完全清楚您从views-field-nothing-1中获取了什么,但是如果只关注view-fields-nothing,可以像这样操作:
courses_list=[]

for item in g_data2:
   try:
      name=item.contents[1].find_all("div",{"class":"views-field-title"})[0].text
   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=''

   course=[name,address1,address2]
   courses_list.append(course)

这将把课程放在一个列表中,然后您可以像这样将它们写入csv文件:
import csv

with open ('filename.cv','wb') as file:
   writer=csv.writer(file)
   for row in course_list:
      writer.writerow(row)

1
谢谢你的帮助!所以我使用了views-field-nothing-1来生成所有权并告诉它是私有还是公共的。我该如何将其与我的给定脚本结合起来,如果我想让我的代码处理其他页面的数据,因为列表有大约20页,我该如何从其他页面抓取数据?最后,我该如何将CSV文件保存到我的Mac本地驱动器上? - Gonzalo68
NVM,我明白了它是如何保存的,是否可以指定一个文件夹?如何让我的脚本循环遍历网站的其他部分以获取其他数据?如何为我的CSV文件创建标题?非常感谢,这对我非常有帮助! - Gonzalo68
你可能想要阅读一篇关于Python列表的教程。一个标题行只是另一个你将要添加到主列表中的列表。因此,在推送课程的循环之前,你可以这样做:courses_list.append([name,address1,address2])。 - AustinC
我无法确切地谈论网站的其他部分 - 我猜您想要做的是创建一个主循环来浏览页面。假设每个页面都是www.pga.com/golf-courses/x.html,其中x是搜索字符串 - 您将不得不找出如何更改该搜索字符串以获得所需的所有各种页面。生成一个大参数列表,例如zip_codes=[20002,20770,77803,...],然后循环遍历它们,并为每个参数执行以下操作:for zip in zip_codes: url=base_url+zip your code - AustinC
但这些都是很大的问题!我建议看一些Python教程,以便熟悉涉及列表和其他数据类型(如字典)的一些基本操作。 - AustinC

0
首先,您需要将所有项目放入列表中,然后在爬取过程中出现错误时稍后写入文件。而不是仅打印,请将其附加到列表中。 然后,您可以将其写入CSV文件。
f= open('filename', 'wb')
csv_writer = csv.writer(f)
for i in main_list:
    csv_writer.writerow(i)
f.close()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接