【问题标题】:Scraping and Parsing a website for information [closed]抓取和解析网站以获取信息[关闭]
【发布时间】:2015-06-30 22:28:45
【问题描述】:

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

第二个地址字段我想解析出要分发到我的 CSV 中不同列的信息。我希望将地址字段分解为街道名称和编号、城市、CA、邮政编码和国家/地区。

最后,我想知道是否可以创建一个函数,当地址的字符串中有一个邮政信箱时,它将被移动到另一个名为邮政信箱的列中。我该怎么做?

我想将所有这些信息保存到包含我需要的所有数据的 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])

【问题讨论】:

  • 您能否给出一个直观的示例来说明您希望输出的样子?这将有助于弄清楚您需要 CSV 的外观。

标签: python parsing csv beautifulsoup scrape


【解决方案1】:

我认为 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

【讨论】:

  • 所以我尝试使用您的代码,但我没有得到所有值?我做错了什么?
  • 抱歉,Gonzalo,我的代码中有几个小错误,现在应该可以为您工作了。
  • 感谢您修复它。我还有一个问题,如何将其附加到不同的列并将其保存到 CSV?
  • 我添加了导出到 CSV 的说明。
  • DataFrame 模块出现属性错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多