2015-04-14 9 views
0

Я создал веб-скребок, который извлекает все изображения на веб-сайте. Мой код должен печатать каждый URL-адрес img на стандартный вывод и записывать csv-файл со всеми этими функциями, но прямо сейчас он записывает только последнее изображение, найденное в файл, и номер этого результата в 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?

+0

Объект 'data', как указано в 7-й строке снизу, содержит только одну строку. – bernie

+0

@bernie Итак, как я могу распознать все данные в reine? –

+0

@Celeo Извините, я пытаюсь распечатать все данные –

ответ

1

Вы видите только последний результат в своем CSV, потому что data никогда не обновляется должным образом в рамках цикла for: вы только записываете его один раз, когда вы выходите из цикла. Чтобы получить все соответствующие фрагменты HTML, добавленные в ваш список data, вы должны указать indent и использовать метод 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, если вы хотите создать более надежные веб-скребки.