抓取和解析网站以获取信息

Scraping and Parsing a website for information

我正在尝试收集有关美国所有高尔夫球场的信息。我创建了一个脚本来从 PGA 网站上抓取数据,该网站提供了大约 18000 个高尔夫球场。所以我的脚本 运行 不正确,我在修复它时遇到了问题。它假设为所有权创建一个列,假设它是私有的或 public 提供信息。我能够找到这些信息,但在执行时它被放置在 CSV 的随机部分并且没有与其正确的高尔夫球场信息结合。我该如何解决它会给我所有必要的数据,包括姓名、地址、phone 号码和网站。

其次是地址字段,我想解析出要分发到我的 CSV 中不同列中的信息。我希望地址字段分解为街道名称和号码、城市、加利福尼亚州、邮政编码和国家/地区。

最后,我想知道是否可以创建一个函数,当地址的字符串中有一个 P.O Box 时,它会被移动到另一个名为 PO Box 的列中。我该怎么做?

我想将所有这些信息和我需要的所有数据一起保存到 CSV 文件中

这是我的脚本:

import csv
import codecs
import requests 
from bs4 import BeautifulSoup

courses_list = []
for i in range(1):      # 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_data1=soup.find_all("div",{"class":"views-field-nothing-1"})
     g_data2=soup.find_all("div",{"class":"views-field-nothing"})

     for item in g_data2 and g_data1:
          try:
               ownership = item.contents[1].find_all("div",{"class":"views-field-course-type"})[0].text
               print (ownership)
          except:    
               ownership = ''
          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,ownership]
          courses_list.append(course)

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

我认为 Beautiful Soup 在这里可能有点矫枉过正,您应该能够仅使用正则表达式解析此页面。我刚刚为您完成了前两个字段,我会留给您填写其他字段。对了,你的列表不要叫list,这是Python中的保留字。

import re
import requests

L = []
for i in range(1):      # 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)
     ownership = re.findall('(?<=<div class="views-field-course-type"><span class="field-content">)([^<]+)',r.text)    
     address = re.findall('(?<=<div class="views-field-address"><span class="field-content">)([^<]+)', r.text)
     L.extend(zip(ownership,address))

如果您想导出为 CSV,Pandas DataFrame 可能是最简单的方法:

import pandas as pd
df = pd.DataFrame(L, columns = ['Ownership','Address'])
df.to_csv('c:/golfcourselist.csv')
df.head()

  Ownership             Address
0   Private   1801 Merrimac Trl
1    Public     12551 Glades Rd
2    Public  13601 SW 115th Ave
3    Public  465 Warrensburg Rd
4    Public    45120 Waxpool Rd