我正试图从“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])
答案 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"})
这样,您只需抓取包含article
和itemtype = http://schema.org/Organization"
标记内的数据,即可轻松完成抓取操作。这是足够独特的,幸运的是所有条目都符合这种格式。
我还将csvwriter
从a
更改为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])