【问题标题】:URL file to table scrape and save to csvURL 文件到表格抓取并保存到 csv
【发布时间】:2019-03-06 01:22:12
【问题描述】:

总的来说,我对编码很陌生。我知道 excel 和一些 VBA,但我一直坚持把这些部件放在一起。 我有一个 URL 列表,下面给出了我想要的 1 个 URL 的输出,但我有 500 个具有相同数据的 URL。 我想要做的是让它读取 url 文件获取数据并将输出保存到 csv 中。请帮我解决这个问题。我知道这很简单,而且我找到了很多方法来做到这一点,但是把所有的和平放在一起很难。 谢谢 迈克

import bs4 as bs
import urllib.request
import pandas as pd
import csv 

with open("tvlocation.csv","r") as file:
file.write('dfs = pd.read_html('tvurl.txt')
for df in dfs:
    print(df)

file.close()

【问题讨论】:

  • 你应该检查你的代码从第 7 行到第 9 行的缩进。另外,你的目的是什么?读取csv 文件还是写入csv 文件?如果要保存到csv 文件中,它应该是'w' 而不是'r'。第 7 行中的单引号位置和右括号也不正确。愿它有所帮助。
  • 嗯,我想从它从中提取数据的表中写入 csv。我怎样才能让它访问我拥有的 url 列表?
  • 您是否成功从 URL 中检索数据?如果没有,您能告诉我您要抓取的网址吗?
  • 好吧,我可以使用下面的代码抓取表格数据。但是当我试图将它保存到一个文件并让它引用 url 列表时,我卡住了 import bs4 as bs import urllib.request import pandas as pd import csv dfs = pd.read_html('nocable.org/browse-stations/callsign/cadenatres-linares-nl') for df in dfs : 打印(df)

标签: python pandas url beautifulsoup export-to-csv


【解决方案1】:

由于您有 500 个 URL,您可以将其保存到文件中。然后,您可以将这些行读入一个列表并在每个行上使用read_html(),以获取一个数据框列表。将第一个数据框的第二列获取到一个列表中,并使用 csv 模块将其写入文件。

import pandas as pd
import csv
url_list=[]
with open('file.csv','w') as csvfile, open('urls.txt','r') as urlfile:
    writer = csv.writer(csvfile, delimiter=',', quotechar='"')
    #Write the headers
    writer.writerow(['State','City','Country','Callsign','Network Affiliation'])
    #Read urls into a list
    urls=urlfile.readlines()
    for url in urls:
        dfs = pd.read_html(url.strip())
        #convert second column of 1st dataframe to a list and write to csv file
        writer.writerow(list(dfs[0][1])[:-1])

urls.txt

https://nocable.org/browse-stations/callsign/cadenatres-linares-nl
https://nocable.org/browse-stations/callsign/k27hm-d-quanah-tx

文件.csv

State,City,Country,Callsign,Network Affiliation
Newfoundland and Labrador,AGUALEGUAS,USA,CADENATRES,INDEPENDENT
Texas,QUANAH,USA,27,K27HM-D,INDEPENDENT

您可能需要考虑在每个 url 上使用 read_html 时添加一些随机延迟。此外,如果您想以 50 个 url 等块的形式执行此操作,请不要忘记将写入模式从 'w' 更改为 'a' 并删除第二次写入标头的代码。

【讨论】:

  • 第二行没有足够的列放27的数据值。
  • @Yusufsn 该网址不在问题中。为了清楚起见,我添加了它,您可以使用多个 url。
  • 这很管用,我放了一个 time.sleep 以确保我不会破坏任何东西
【解决方案2】:

您可以使用字典列表。

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

url_list = ['https://nocable.org/browse-stations/callsign/cadenatres-linares-nl',
            'https://nocable.org/browse-stations/callsign/k27hm-d-quanah-tx']
data = []
for url in url_list:
    page = urllib.request.urlopen(url)
    soup = BeautifulSoup(page, "html.parser")

    urldict = {}
    tr = soup.find_all('tr')
    for row in tr:
        th = soup.find_all('th')
        td = soup.find_all('td')

    for item in range(0,len(th)):    
        urldict.update({th[item].text:td[item].text})

    data.append(urldict)

csv 文件中定义要用作标题的列。

cols = []
for d in range(0,len(data)):
    for i in data[d].keys():
        if i not in cols:
            cols.insert(len(cols),i)

然后,将字典列表保存到csv文件中。

with open('file_url.csv', 'w') as output_file:
    dict_writer = csv.DictWriter(output_file, cols)
    dict_writer.writeheader()
    dict_writer.writerows(data)

【讨论】:

  • @yusufan 所以我应该可以复制和粘贴它,它应该可以工作吗?它需要 print() 命令还是什么?
  • 是的,你可以复制粘贴代码。但是,您无需打印任何内容即可保存到csv 文件中。但是,如果您想查看结果,可以使用pandas 读取您的csv 文件,或者直接在您的系统上查看您的csv 文件。
猜你喜欢
  • 1970-01-01
  • 2021-02-06
  • 2019-09-10
  • 1970-01-01
  • 2017-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-11
相关资源
最近更新 更多