抓取和解析网站以获取信息[关闭]

问题描述 投票:0回答:1

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

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

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

我想将所有这些信息与我需要的所有数据一起保存到 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])
python csv parsing web-scraping beautifulsoup
1个回答
0
投票

我认为 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
© www.soinside.com 2019 - 2024. All rights reserved.