#python #pandas #url #beautifulsoup #export-to-csv
#python #pandas #url #beautifulsoup #экспорт в 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()
Комментарии:
1. Вы должны проверить свой отступ в коде от строки 7 до 9. Кроме того, какова ваша цель? Чтение
csv
файла или запись вcsv
файл? Если вы хотите сохранить вcsv
файл, это должно быть'w'
вместо'r'
. Расположение одинарных кавычек и закрывающей скобки в строке 7 также неверно. Может быть, это поможет.2. Ну, я хочу записать в csv из таблиц, из которых он извлекает данные. Как я могу получить доступ к списку имеющихся у меня URL-адресов?
3. Удалось ли вам извлечь данные из URL? Если нет, не могли бы вы показать мне URL, который вы хотите очистить?
4. Ну, я смог очистить данные таблицы с помощью следующего кода ниже. Но когда я попытался сохранить его в файл и сослаться на список 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 ‘ ) для df в dfs: печать (df)
Ответ №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
file.csv
State,City,Country,Callsign,Network Affiliation
Newfoundland and Labrador,AGUALEGUAS,USA,CADENATRES,INDEPENDENT
Texas,QUANAH,USA,27,K27HM-D,INDEPENDENT
Возможно, вы захотите добавить некоторую случайную задержку при использовании read_html для каждого URL. Также, если вы хотите сделать это фрагментами, скажем, по 50 URL и т.д., То не забудьте изменить режим записи на ‘a’ с ‘w’ и удалить код, который записывает заголовки со второго раза.
Комментарии:
1. Во второй строке недостаточно столбца, чтобы поместить значение данных
27
.2. @Yusufsn Этот URL-адрес не был в вопросе. Я добавил для наглядности, что вы можете использовать несколько URL-адресов.
3. Это сработало, я установил 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)
Комментарии:
1. @yusufan Значит, я должен иметь возможность скопировать и вставить это, и это должно сработать? Нужна ли для этого команда print () или что-то еще?
2. Да, вы можете скопировать и вставить код. Однако вам не нужно ничего печатать для сохранения в
csv
файл. Но если вы хотите увидеть результат, вы можете использовать егоpandas
для чтения вашегоcsv
файла или просто проверить вашcsv
файл непосредственно в вашей системе.