URL文件到表抓取并保存到csv

时间:2019-03-06 01:22:13

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

对于一般的编码我还是很陌生的。我知道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()

2 个答案:

答案 0 :(得分:0)

由于您有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

file.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个网址等块的形式执行此操作,则不要忘记将写入模式从“ w”更改为“ a”,并删除第二次写入标头的代码。

答案 1 :(得分:0)

您可以使用词典列表。

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)