如何修改此代码以使用csv中的url列表,转到这些页面,然后执行代码的最后一部分以检索正确的数据?
我已经感觉到csv存储链接的代码部分并从它们检索数据是远离的,但我有一个csv我的目标列表每行列出一个,最后一部分这个针对联系人详细信息等的代码也正常工作。
import requests
import re
from bs4 import BeautifulSoup
import csv
#Read csv
csvfile = open("gymsfinal.csv")
csvfilelist = csvfile.read()
#Get data from each url
def get_page_data():
for page_data in csvfilelist:
r = requests.get(page_data.strip())
soup = BeautifulSoup(r.text, 'html.parser')
return soup
pages = get_page_data()
'''print pages'''
#The work performed on scraped data
print soup.find("span",{"class":"wlt_shortcode_TITLE"}).text
print soup.find("span",{"class":"wlt_shortcode_map_location"}).text
print soup.find("span",{"class":"wlt_shortcode_phoneNum"}).text
print soup.find("span",{"class":"wlt_shortcode_EMAIL"}).text
th = soup.find('b',text="Category")
td = th.findNext()
for link in td.findAll('a',href=True):
match = re.search(r'http://(\w+).(\w+).(\w+)', link.text)
if match:
print link.text
gyms = [name,address,phoneNum,email]
gym_data_list.append(gyms)
#Saving specific listing data to csv
with open ("xgyms.csv", "wb") as file:
writer = csv.writer(file)
for row in gym_data_list:
writer.writerow(row)
gymsfinal.csv片段:
http://www.gym-directory.com/listing/green-apple-wellness-centre/
http://www.gym-directory.com/listing/train-247-fitness-prahran/
http://www.gym-directory.com/listing/body-club/
http://www.gym-directory.com/listing/training-glen/
更改为writer.writerow([row])
,以便在每个字母之间保存csv数据而不使用逗号。
答案 0 :(得分:2)
这里有几个问题。首先,你永远不会关闭你的第一个文件对象,这是一个很大的禁忌。您应该使用在代码段底部使用的with
语法来读取csv。
您收到错误requests.exceptions.MissingSchema: Invalid URL 'h': No schema supplied. Perhaps you meant http://h?
,因为当您阅读csv时,您只是将其作为一个大字符串读取,并添加换行符。所以当你用for page_data in csvfilelist:
迭代它时,它会遍历字符串中的每个字符(字符串在Python中是可迭代的)。显然,这不是一个有效的URL,因此请求会抛出异常。当您阅读文件时,它应该看起来像这样
with open('gymsfinal.csv') as f:
reader = csv.reader(f)
csvfilelist = [ row[0] for row in reader ]
您还应该更改从get_page_data()
返回网址的方式。目前,你只会回来第一汤。为了让它返回所有汤的生成器,您需要做的就是将return
更改为yield
。 Good resource on yield and generators
您的打印状态也会出现问题。它们应该进入一个看起来像for soup in pages:
的for循环,或者它们应该进入get_page_data()
。在这些打印的上下文中没有定义变量soup
。