使用python从给定网站上正确删除数据

时间:2015-06-30 02:03:13

标签: python csv beautifulsoup scrape

我正试图从“thegolfcourse.net”网站上提取高尔夫球场信息。我的目标是从网站上收集美国18000多个高尔夫球场的名称,地址和电话号码。我运行了我的脚本,但它不会产生网站上的所有数据。有18000多个高尔夫球场,但我只从网站上下载了200多个网站。我不知道我的循环是错误的还是我没有根据我的代码访问所有数据,而且我的数据中还有空格,我想知道如何正确提取数据。

这是我的剧本:

import csv
import requests 
from bs4 import BeautifulSoup

courses_list = []

for i in range(56):
 url="http://www.thegolfcourses.net/page/{}?ls&location&orderby=title".format(i)
 r = requests.get(url)
 soup = BeautifulSoup(r.content)


g_data2=soup.find_all("article")


for item in g_data2:
  try:
    name = item.contents[5].find_all("a")[0].text
    print name
  except:
        name=''      
  try:
    phone= item.contents[13].find_all("p",{"class":"listing-phone"})[0].text
  except:
      phone=''
  try:
    address= item.contents[13].find_all("p",{"class":"listing-address"})[0].text
  except:
      address=''

  course=[name,phone,address]
  courses_list.append(course)


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

1 个答案:

答案 0 :(得分:1)

首先,你的代码没有抓住所有内容,因为你将范围设置为56.哪个适合测试,但如果你想获取你需要设置的所有内容

for i in range(1907):

这到1907年是因为它将在1907年因为将.format(i+1)添加到URL部分而停止。

此外,您的for循环中有多处错误。当您发布到StackOverflow但这些问题可能已经解决了,但我还是将它们清理干净了。

当我第一次看到'间距'时,我运行你的代码。解析HTML时,您解析它以查找article标记,但该标记还会处理在示例链接中显示"Listings found for "" near ""的第一个搜索结果。您可以通过使用我在此处执行的操作来缩小网络范围的范围:

g_data2 = soup.find_all("article",{"itemtype":"http://schema.org/Organization"})

这样,您只需抓取包含articleitemtype = http://schema.org/Organization"标记内的数据,即可轻松完成抓取操作。这是足够独特的,幸运的是所有条目都符合这种格式。

我还将csvwritera更改为wb,每次运行脚本时都会启动新的CSV并且不会附加到该文件。

以下是最终脚本:

import csv
import requests
from bs4 import BeautifulSoup

courses_list = []

for i in range(1907):
    url="http://www.thegolfcourses.net/page/{}?ls&location&orderby=title".format(i+1)
    r = requests.get(url)
    soup = BeautifulSoup(r.text)
    #print soup
    g_data2 = soup.find_all("article",{"itemtype":"http://schema.org/Organization"})

    for item in g_data2:
        try:
            name = item.find_all("h2",{'class':'entry-title'})[0].text
            print name
        except:
            name=''
            print "No Name found!"
        try:
            phone= item.find_all("p",{"class":"listing-phone"})[0].text
        except:
            phone=''
            print "No Phone found!"
        try:
            address= item.find_all("p",{"class":"listing-address"})[0].text
        except:
            address=''
            print "No Address found!"
        course=[name,phone,address]
        courses_list.append(course)

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