Как правильно сделать петлю в скрапе? - PullRequest
0 голосов
/ 28 апреля 2019

Я создал и другие страницы, но я показываю вам одну. Я сделал другую функцию специально для зацикливания, но она не дает мне результата. Это дает мне ошибку. Где поставить find_items функцию? Или есть другая проблема?

Вот ошибка:

yield from find_items(response, names1, finder1)
NameError: name 'find_items' is not defined

Вот код:

    # save and call request to another page
    dct = [(self.about_page, self.parse_about)]
    for page, callback in dct:
        yield response.follow(page, callback, meta={'items': items})

def find_items(response, names1, finder1):
    items = response.meta['items']
    for name, find in zip(names1.values(), names1.values()):
        items[name] = response.css(find).extract()
        yield items


def parse_about(self, response):
    # do your stuff on second page
    # items = response.meta['items']
    names1 = {'name1': 'Headings',
          'name2': 'Paragraphs',
          'name3': '3 Projects',
          'name4': 'About Dmoz',
          'name5': 'Languages',
          'name6': 'You can make a differnce', 
          'name7': 'Further Information'
          }

    finder1 = {'find1': 'h2::text , #mainContent h1::text',
           'find2': 'p::text',
               'find3': 'li~ li+ li b a::text , li:nth-child(1) b a::text',
               'find4': '.nav ul a::text , li:nth-child(2) b a::text',
               'find5': '.nav~ .nav a::text',
           'find6': 'dd::text , #about-contribute::text',
           'find7': 'li::text , #about-more-info a::text'
          }

    yield from find_items(response, names1, finder1)

1 Ответ

0 голосов
/ 28 апреля 2019

Для этого случая find_items должно быть за пределами вашего класса.

Если вы хотите использовать его внутри класса, проверьте отступы и добавьте self к параметрам:

def find_items(self, response, names1, finder1):
    items = response.meta['items']
    for name, find in zip(names1.values(), names1.values()):
        items[name] = response.css(find).extract()
        yield items

И в parse_about не забудьте также добавить self.:

yield from self.find_items(response, names1, finder1)

Кроме того, проверьте свою версию Python. Использование yield from появилось только в версии 3.x. Для версии 2.x вы должны использовать:

for item in self.find_items(response, names1, finder1):
    yield item
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...