当前位置: 首页 > 知识库问答 >
问题:

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

桑飞语
2023-03-14

我有一个csv文件中的100个URL列表。第一列中的每一行都有一个url。我想加载每个url并从每个url中提取一段数据

目前,我可以使用beautifulsoup和以下代码手动加载单个页面,以获取“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])

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

尝试以下代码,但无法让它工作-我迷路了:

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])

我看到所有加载的URL,但是如何循环每个URL以获得我想要的特定标记?由于未定义r,因此也将获取r错误。。。

当我添加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

我得到以下错误:

Traceback(最近一次调用最后一次):文件"C:\用户\alexa\Desktop\csv循环2.py",第15行,soup.find_all('h1')。内容文件"C:\Python36\lib\site-包\beautifulsoup4-4.6.0-py3.6.egg\bs4\element.py",第1807行,在getattr"ResultSet对象没有属性'%s'。您可能将项目列表视为单个项目。当你打算调用find_all()时,你调用了吗?"%key属性错误:ResultSet对象没有属性内容。您可能将项目列表视为单个项目。当你想调用find_all()时,你调用了吗?

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

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

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

headers={'User-Agent':'Mozilla/5.0(Windows NT 6.3;Win64;x64)AppleWebKit/537.36(KHTML,比如Gecko)Chrome/54.0.2840.71 Safari/537.36'}r=请求。get(urldet,headers=headers)soup=BeautifulSoup(r.content,“lxml”)

共有3个答案

公羊瀚
2023-03-14
import pandas as pd
from bs4 import BeautifulSoup

URL_filename = 'URL.csv'
URL_column_name = "Address"
data = pd.read_csv(input_filename,encoding='utf8')
weblink = (data[address_column_name]).tolist()

i=0
while i<len(weblink):
  page = request.get(weblink[i])
  Soup = BeautifulSoup(page.text,'html.parser')
  print(Soup)

  i+=1
戚澄邈
2023-03-14

您可以使用Python的csv模块,类似于您编写它们的方式。定义一个空列表来保存网址并读取网址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>])
夏飞掣
2023-03-14

使用Pythoncsv模块从文件中读取并获取所有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)
 类似资料:
  • 我正在通过SSIS将数据从csv文件加载到我的sql表中。是否对从csv文件读取的记录数指定了默认限制? 在加载csv文件时,我的数据流组件只处理5000条记录,尽管它包含5341条记录,如下面的图像所示。我如何修复这个问题?

  • 当通过数据库加载csv时,第2行下面的第4列没有加载。CSV的列数每行不同。 null 但是没有将上面的rdd转换为dataframe会导致错误 df2=sqlcontext.read.format(“com.databricks.spark.csv”).schema(模式).load(“sample_files/test_01.csv”) df2.show() df2.show() 但是,当no

  • 我想从多列csv文件中读取特定列,并使用Java在其他csv文件中打印这些列。需要帮忙吗?下面是我逐行打印每个令牌的代码。。但我希望只打印多列csv中的几列。

  • HDFS设置: 未设置。 不返回任何内容。 我试图避免自己在加载后不得不在应用程序中重新分区。 是否有一种方法可以强制Spark用存储在HDFS上的相同数量的分区加载parquet文件?

  • 在Spring,如果我们有两个.yaml文件作为。(包含在应用程序中) 如果这个配置的属性类类似于- 则仅从一个文件加载“流”,即流。size()给出2.(remote04,remote05。这取决于application.yaml中配置文件的顺序) 但如果我将yamls文件更改为- 和属性类 现在hashmap将有4个条目。i、 e.流量。size()给出4 那么,这是否意味着Spring不会从

  • 问题内容: 我正在寻找一种“更好”的方式来执行查询,在该查询中,我想向单个玩家显示他之前玩过的游戏以及与每个此类对手相关的获胜记录。 以下是涉及的表格,精简如下: 因此,约翰对玛丽的战绩是2胜1负。vs鲍勃1胜0负; 和爱丽丝的3胜2负。 我正在使用Postgres 9.4。我脑海中有些东西告诉我要考虑一下,但是我很难理解这样的“形状”。 以下是我当前正在使用的查询,但是有些“感觉不到”。请帮助我