从csv文件加载URL列表,并逐个解析它们以获取相同的数据

时间:2018-01-24 04:07:25

标签: python python-3.x csv beautifulsoup

我在csv文件中有一百个网址列表。第一列中的每一行都有1个网址。我想加载每个网址并从每个网址中抓取一条数据。

目前,我可以使用beautifulsoup和以下代码手动加载单个页面,以获取“类型”并将其保存到csv文件中:

int *list = new int[5];
list[0] = 10; list[3] = 25; // Whatever
for (int i = 0; i < 5; i++)
    list[i] = 1+1;

但是,如果我想从csv文件中获取url列表,然后使用代码解析每个url并将每个“Type”保存到新csv文件中的单独行,我不知道从哪里开始。有什么想法吗?

尝试使用以下代码但无法使其正常工作 - 我迷路了:

from bs4 import BeautifulSoup
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64)     AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36'}

urldet = "http://www.someusefulhtmlpage.com/page1.html"
r = requests.get(urldet, headers=headers)
soup = BeautifulSoup(r.content, "lxml")

def get_txt(soup, key):
    key_tag = soup.find('span', text=re.compile(key)).parent
    return key_tag.find_all('span')[1].text
type = get_txt(soup, 'Type')

with open('someusefulhtmlpage_file.csv', 'a', newline='') as csv_file:    
 writer = csv.writer(csv_file)
 writer.writerow([type])

我看到所有网址都已加载但是我如何遍历每个网址以获取我想要的特定标记?还得到r错误,因为r未定义...

@theausome,当我添加r = requests.get(all_urls, headers=headers) soup = BeautifulSoup(r.content, "lxml") all_urls = [] with open('urllist.csv') as csv_file: reader = csv.reader(csv_file) for row in reader: all_urls.append(row[0]) 时:

find_all

我收到以下错误:

  

回溯(最近一次调用最后一次):文件“C:\ Users \ alexa \ Desktop \ csv   loop 2.py“,第15行,in       soup.find_all('h1')。contents文件“C:\ Python36 \ lib \ site-packages \ beautifulsoup4-4.6.0-py3.6.egg \ bs4 \ element.py”,   第1807行, getattr       “ResultSet对象没有属性'%s'。你可能正在处理像单个项目一样的项目列表。当你使用时,你是否调用了find_all()   意味着调用find()?“%key AttributeError:ResultSet对象没有   属性'内容'。你可能正在处理像a这样的项目列表   单项。当你打算调用find()时,你调用了find_all()吗?

我一定错过了什么。我想知道是否可能是因为我使用以下代码来获取我的标签:

import csv
import re
from urllib.request import urlopen
from bs4 import BeautifulSoup

contents = []
with open('urllist.csv','r') as csvf: # Open file in read mode
    urls = csv.reader(csvf)
    for url in urls:
        contents.append(url) # Add each url to list contents

for url in contents:  # Parse through each url in the list.
    page = urlopen(url[0]).read()
    soup = BeautifulSoup(page, "html.parser")
    soup.find_all('h1').contents

这可能与循环相冲突? 我也用:

def get_txt(soup, key): key_tag = soup.find('span', text=re.compile(key)).parent return key_tag.find_all('span')[1].text

3 个答案:

答案 0 :(得分:2)

你可以使用Python的csv模块,就像你编写它们一样。定义一个空列表来保存URL并读取url csv:

all_urls = []
with open('<urls>.csv') as csv_file:
    reader = csv.reader(csv_file)
    for row in reader:
        all_urls.append(row[<column of url>])

答案 1 :(得分:2)

使用Python csv模块从文件读取并获取所有URL(文件中的每个URL在单独的行中)到列表然后解析。

import csv
from urllib.request import urlopen
from bs4 import BeautifulSoup

contents = []
with open('file.csv','r') as csvf: # Open file in read mode
    urls = csv.reader(csvf)
    for url in urls:
        contents.append(url) # Add each url to list contents

for url in contents:  # Parse through each url in the list.
    page = urlopen(url[0]).read()
    soup = BeautifulSoup(page, "html.parser")
print(soup)

答案 2 :(得分:0)

sin(3)