2015-06-30 5 views
0

Я пытаюсь собрать информацию обо всех полях для гольфа в США. Я создал сценарий для очистки данных с веб-сайта PGA, который содержит около 18000 полей для гольфа. Поэтому мой скрипт работает неправильно, и у меня проблема с его исправлением. Предполагается создать столбец для собственности, который предполагает предоставлять информацию, если она является частной или общедоступной. Мне удалось найти информацию, но когда она была выполнена, она помещается в случайные части CSV и не соединяется с ее правой информацией о поле для гольфа. Как мне решить, что он даст мне все необходимые данные от имени, адреса, номера телефона и веб-сайта.Скребок и анализ веб-сайта для информации

Второй для поля адреса Я хочу проанализировать информацию, которая будет распространена в разных столбцах в моем CSV. Я хочу, чтобы поле адреса разбилось на название улицы и номер, город, CA, индекс и страну.

Наконец, мне было интересно, можно ли создать функцию, которая, когда адрес имеет поле P.O в своей строке, будет перемещен в другой столбец с именем 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]) 
+0

Вы можете дать визуальный пример того, что вы хотите, чтобы вывод выглядеть точно? Это поможет выяснить, что вам нужно, чтобы CSV выглядел. – serk

ответ

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, Панды 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 
+0

Итак, я попытался использовать ваш код, но я просто не получил ни одного значения для всех значений? Я делаю что-то неправильно? – Gonzalo68

+0

Извините, Гонсало, в моем коде было несколько небольших ошибок, теперь это должно сработать для вас. – maxymoo

+0

Спасибо за исправление. У меня есть другой вопрос, как добавить его в разные столбцы и сохранить его в CSV? – Gonzalo68