2015-07-19 3 views
4

Я относительно новичок в Scrapy, Python и объектно-ориентированном программировании, так что извиняюсь, если я получаю какую-либо терминологию некорректно или неясно каким-либо образом.Scrapy: изменение элементов и полей в ответе

Я пытаюсь написать паука, который, поскольку он сбрасывает элементы из ответа, также создаст модифицированную версию ответа для сохранения в файл. Например, я пытаюсь изменить ссылки 'src', чтобы указать на скопированные файлы, сохраненные локально.

В настоящее время я очищаю данные с помощью селекторов Scrapy и изменяя ответ с помощью lxml. Тем не менее, я хочу использовать методы Scrapy для модификации вместо lxml, поскольку использование селекторов Scrapy и lxml означает, по существу, удвоение кода для поиска тех же элементов в ответе.

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

Защиту синтаксического анализа (сам, ответ):

# Scrape thumbnail URLs using Scrapy selectors 
    for post in response.css('.post'): # For each post 
     for thumb in post.css('.thumb'): # For each thumbnail 
      item = Item() # Create an image item 
      item['thumbnail_url'] = [] 
      item['thumbnail_savepath'] = [] 
      for x in thumb.xpath('img/@src').extract(): 
       thumbnail_url = 'https:' + x 
       thumbnail_filename = re.search('.*/(.*)', thumbnail_url).group(1) 
       thumbnail_savepath = 'thumbnails/' + thumbnail_filename 
       item['thumbnail_url'] += [thumbnail_url] 
       item['thumbnail_savepath'] += [thumbnail_savepath] 

    # Make modified html using lxml 
    body_lxml = lxml.html.document_fromstring(response.body) 
    for thumbnail in body_lxml.xpath('//img'): 
     thumbnail_src = thumbnail.get('src') # Original link address 
     thumbnail_path = './thumbnails/' + basename(thumbnail_src) # New link address 
     thumbnail.set('src',image_path) # Setting new link address 

Как показывает код, он перебирает изображения, чтобы очистить элементы с помощью селекторов Scrapy, то итерация второго раза с помощью LXML для изменения ответа. Я должен использовать два разных метода для циклического перехода по тем же элементам, которые я пытаюсь избежать. Я бы хотел сделать скребок и модификацию в том же цикле, если это возможно.

Я думал, что можно использовать метод response.request(), но я стараюсь понять, как использовать это из документации и поиска в Интернете. Есть ли какой-то метод, позволяющий Scrapy модифицировать отдельные элементы или поля в ответе? Любая помощь будет оценена по достоинству.

Спасибо.

+0

Прочтите документацию [scrapy pipelines] (http://doc.scrapy.org/en/latest/topics/item-pipeline.html#item-pipeline) и постарайтесь быть более конкретными с вашим вопросом. См. [Ask] –

+0

Привет, Франк. Спасибо, что обратили внимание на мой вопрос. Я добавил несколько примеров кода и попытался сделать вопрос более конкретным и понятным. Все происходит в основной функции анализа паука (т.е. перед конвейерами). Дайте мне знать, если я еще могу сделать вопрос более понятным для вас/других. Marcus – Marcus

+0

@FrankMartin Я считаю, что это пример вопроса, который следует всем рекомендациям, перечисленным на этой странице.Это ясно, специфично, правильно помечено, хорошо написано с точки зрения грамматики и выбора слов, и от первого пользователя. – Borealid

ответ

0

Я смущен, а также то, что вы пытаетесь достичь, вы пытаетесь изменить правильные селектора?

Я знаю, что это идет вразрез с переливной политики, чтобы узнать больше в ответ, но действительно некоторые вещи нужно еженедельно до

Глядя просто код кажется, что вы пытаетесь сделать СЦЕПИТЬ редактировать свои пункты.

Что такое генератор, который относится к двум, затем «отредактируйте», что является окончательным результатом? Если это так, тогда происходит то, что вы не можете объединить неявный список и строки.

enter image description here

, что вы должны сделать в этом случае, чтобы раздеть, то вы присоединитесь и установите значение для каждого ... Если вы или кто-то есть что-то подобное просьба представить полные примеры любого кода, который может иметь отношение к ... Как в этом случае будет весь код паука ... И конвейер, даже если исходный плакат не использует его так, как он должен, если он хочет сохранить, или я всегда мог бы просто использовать функцию записи

Смежные вопросы