抓取和解析网站以获取信息
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
我正在尝试收集有关美国所有高尔夫球场的信息。我创建了一个脚本来从 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