Невозможно записать более одной строки в CSV

Я создал веб-скрейпер, который извлекает все изображения на веб-сайте. Мой код должен выводить каждый URL-адрес img в стандартный вывод и записывать CSV-файл со всем этим, но сейчас он записывает только последнее найденное изображение в файл и номер этого результата в CSV.

Вот код, который я сейчас использую:

# This program prints a list of all images contained in a web page 
#imports library for url/html recognition
from urllib.request import urlopen
from HW_6_CSV import writeListToCSVFile
#imports library for regular expressions
import re
#imports for later csv writing
import csv
#gets user input
address = input("Input a url for a page to get your list of image urls       ex. https://www.python.org/:  ")
#opens Web Page for processing
webPage = urlopen(address)
#defines encoding
encoding = "utf-8"
#defines resultList variable
resultList=[]
#sets i for later printing
i=0
#defines logic flow
for line in webPage :
   line = str(line, encoding)
   #defines imgTag
   imgTag = '<img '
   #goes to next piece of logical flow
   if imgTag in line :
      i = i+1
      srcAttribute = 'src="'
      if srcAttribute in line:
      #parses the html retrieved from user input 
       m = re.search('src="(.+?)"', line)
       if m:
          reline = m.group(1)
          #prints results
          print("[ ",[i], reline , " ]")

data = [[i, reline]]

output_file = open('examp_output.csv', 'w')
datawriter = csv.writer(output_file)
datawriter.writerows(data)
output_file.close()
webPage.close()

Как заставить эту программу записывать все найденные изображения в файл CSV?


person Max Farrell    schedule 14.04.2015    source источник
comment
Объект data, объявленный в 7-й строке снизу, содержит только одну строку.   -  person mechanical_meat    schedule 15.04.2015
comment
@bernie Итак, как мне заставить его распознавать все данные в перестроении?   -  person Max Farrell    schedule 15.04.2015
comment
@Celeo Извините, я пытаюсь распечатать все данные   -  person Max Farrell    schedule 15.04.2015


Ответы (1)


Вы видите только последний результат в своем csv, потому что data никогда не обновляется должным образом в рамках цикла for: вы записываете его только один раз, когда выходите из цикла. Чтобы все соответствующие фрагменты HTML были добавлены в список data, вы должны сделать отступ для этой строки и использовать метод списка append или extend.

Итак, если вы перепишете цикл как:

img_nbr = 0  # try to avoid using `i` as the name of an index. It'll save you so much time if you ever find you need to replace this identifier with another one if you chose a better name
data = []
imgTag = '<img ' # no need to redefine this variable each time in the loop
srcAttribute = 'src="' # same comment applies here

for line in webPage:
   line = str(line, encoding)
   if imgTag in line :
      img_nbr += 1  # += saves you typing a few keystrokes and a possible future find-replace.
      #if srcAttribute in line:  # this check and the next do nearly the same: get rid of one
      m = re.search('src="(.+?)"', line)
      if m:
          reline = m.group(1)
          print("[{}: {}]".format(img_nbr, reline)) # `format` is the suggested way to build strings. It's been around since Python 2.6.
          data.append((img_nbr, reline)) # This is what you really missed.

вы получите лучшие результаты. Я добавил несколько комментариев, чтобы дать некоторые рекомендации для ваших навыков кодирования, и удалил ваши комментарии, чтобы выделить новые.

Однако ваш код по-прежнему имеет несколько проблем: HTML не следует анализировать с помощью регулярных выражений, если исходный код не очень хорошо структурирован (и даже в этом случае...). Теперь, поскольку вы запрашиваете у пользователя ввод, он может указать любой URL-адрес, и веб-страница чаще всего будет плохо структурирована. Я предлагаю вам заглянуть в BeautifulSoup, если вы хотите создать более надежные веб-скрейперы.

person Oliver W.    schedule 14.04.2015