Как прочитать все URL-адреса из первого столбца в CSV-файле

#python #url

#python #url

Вопрос:

Я пытаюсь прочитать URL-адреса из первого столбца в файле csv. В csv-файле всего 6051 URL-адрес, который я хочу прочитать. Для этого я попробовал следующие коды:

     urls = []
    with open("C:/Users/hyoungm/Downloads/urls.csv") as csvfile:
        blogurl = csv.reader(csvfile)
        for row in blogurl:
            row = row[0]
            print(row)
  

len (строка)

Однако количество отображаемых URL-адресов составляет всего 65. Я понятия не имею, почему общее количество URL-адресов отображается иначе, чем в файле csv.

Кто-нибудь может мне помочь с выяснением того, как прочитать все URL-адреса (всего 6051) из файла csv?

Чтобы прочитать все URL-адреса из файла csv, я также попробовал несколько разных кодов, которые привели к одинаковому количеству URL-адресов (т. е. 65 URL-адресов) или сбою, например: 1)

     openfile = open("C:/Users/hyoungm/Downloads/urls.csv")
    r = csv.reader(openfile)
    for i in r:
        #the urls are in the first column ... 0 refers to the first column
        blogurls = i[0]
        print (blogurls)
    len(blogurls)
  

2)

     urls = pd.read_csv("C:/Users/hyoungm/Downloads/urls.csv")
    with closing(requests.get(urls, stream = True)) as r:
        reader = csv.reader(r.iter_lines(), delimiter = ',', quotechar = '""')
        for row in reader:
            print(row)
            len(row)
  

3)

     with open("C:/Users/hyoungm/Downloads/urls.csv") as csvfile:
        lines = csv.reader(csvfile)
        for i, line in enumerate(lines):
            if i == 0:
        for line in csvfile:
            print(line[1:])
            len(line)
  

4) и

     blogurls = []
    with open("C:/Users/hyoungm/Downloads/urls.csv") as csvfile:
        r = csv.reader(csvfile)
        for i in r:
            blogurl = i[0]
            r = requests.get(blogurl)
            blogurls.append(blogurl)

    for url in blogurls:
        page = urlopen(url[0]).read()
        soup = BeautifulSoup(page, "html.parser")
    len(blogurls)
  

Я ожидаю, что на выходе будет 6051 URL-адрес, первоначально собранный в файле csv, вместо 65 URL-адресов.

После прочтения всех URL-адресов я собираюсь записать текстовые данные с каждого URL-адреса. Я предполагал получить следующие текстовые данные, используя все 6051 URL-адреса. Пожалуйста, нажмите на следующую ссылку для изображения:

коды и результаты основаны на 65 URL-адресах на данный момент

Комментарии:

1. Возможно ли, что вы размещаете здесь часть файла CSV? Может возникнуть проблема с форматированием (неожиданные символы новой строки или разделители). Поскольку ваш CSV не очень большой, вы могли бы прочитать его полностью with open(...) as csvfile: content = file.read() . Затем вы могли бы провести некоторый анализ, чтобы проверить, правильно ли прочитан файл, например, посмотреть, len(content.splitlines()) == 6051 .

2. @EliasStrehle Спасибо за ваше предложение. Я попробовал ваш код, и он показывает общее количество 6051. Однако ссылок по-прежнему всего 65. Кроме того, используя предложенные вами коды, я не могу извлечь текстовые данные, которые мне удалось (пожалуйста, смотрите прикрепленное изображение в моем вопросе). Вы не возражаете, если я отправлю файл csv на вашу электронную почту или по другим каналам? Я не смог найти, как прикрепить файл здесь. Еще раз спасибо!

3. Попробуйте отделить получение списка URL-адресов от фактического обхода их. Это упрощает отладку. Что вы видите, когда запускаете цикл с print(row) ? Он печатает только 65 URL-адресов или 6051 URL-адрес?

4. Когда я запускаю print (строка), он показывает 65 URL-адресов, хотя на самом деле в первом столбце 6051 URL-адрес. Я не уверен, почему коды не могут прочитать все 6051 URL-адрес. Мне нужны все URL-адреса, чтобы записать из них текстовые данные (показано на изображении выше). Не могли бы вы повторить попытку с моим файлом csv?

5. Можете ли вы загрузить куда-нибудь общедоступное? Например, на GitHub?

Ответ №1:

Для меня работают следующие два подхода:

 import requests

r = requests.get('https://raw.githubusercontent.com/GemmyMoon/MultipleUrls/master/urls.csv')
urls = r.text.splitlines()

print(len(urls))  # Returns 6051
  

и

 import csv
import requests
from io import StringIO

r = requests.get('https://raw.githubusercontent.com/GemmyMoon/MultipleUrls/master/urls.csv')
reader = csv.reader(StringIO(r.text))
urls = [line[0] for line in reader]

print(len(urls))  # Returns 6051
  

Комментарии:

1. Вау, я попробую это. Спасибо за вашу проверку!