从csv文件中的URL检索数据 - Python

时间:2015-09-28 23:32:08

标签: python csv web-scraping beautifulsoup

如何修改此代码以使用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数据而不使用逗号。

1 个答案:

答案 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更改为yieldGood resource on yield and generators

您的打印状态也会出现问题。它们应该进入一个看起来像for soup in pages:的for循环,或者它们应该进入get_page_data()。在这些打印的上下文中没有定义变量soup