Как извлечь список элементов с помощью scrapely?

Я использую scrapely для извлечения данных из некоторого HTML, но у меня возникают трудности с извлечением списка элементов.

Проект scrapely github описывает только простой пример:

from scrapely import Scraper s = Scraper() s.train(url, data) s.scrape(another_url) 

Это приятно, если, например, вы пытаетесь извлечь данные, как описано:

Использование (API)

У Scrapely есть мощный API, включая формат шаблона, который можно редактировать извне, что вы можете использовать для создания очень способных скребок.

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

Однако я не уверен, как извлечь данные, если вы нашли что-то вроде

 Ingredientes - 50 gr de hojas de albahaca - 4 cucharadas (60 ml) de piñones - 2 - 4 dientes de ajo - 120 ml (1/2 vaso) de aceite de oliva virgen extra - 115 gr de queso parmesano recién rallado - 25 gr de queso pecorino recién rallado ( o queso de leche de oveja curado) 

Я знаю, что не могу извлечь это с помощью селектора xpath или css, но меня больше интересует использование парсеров, которые могут извлекать данные для похожих страниц.

Scrapely можно обучить извлечению списка предметов. Хитрость состоит в том, чтобы передать первый и последний элементы списка, который будет извлечен в виде списка Python при обучении. Вот пример, вдохновленный вопросом: (Тренировка: список ингредиентов из 10 предметов из url1 , тест: 7- url2 список из url2 .)

 from scrapely import Scraper s = Scraper() url1 = 'http://www.sabormediterraneo.com/recetas/postres/leche_frita.htm' data = {'ingreds': ['medio litro de leche', # first and last items u'canela y az\xfacar para espolvorear']} s.train(url1, data) url2 = 'http://www.sabormediterraneo.com/recetas/cordero_horno.htm' print s.scrape(url2) 

Здесь вывод:

 [{u'ingreds': [ u' 2 piernas o dos paletillas de cordero lechal o recental ', u'3 dientes de ajo', u'una copita de vino tinto / o / blanco', u'una copita de agua', u'media copita de aceite de oliva', u'or\xe9gano, perejil', u'sal, pimienta negra y aceite de oliva']}] 

Обучение по списку ингредиентов вопроса ( http://www.sabormediterraneo.com/cocina/salsas6.htm ) не основывалось непосредственно на страницах «recetas». Одним из решений было бы подготовить несколько скребок, а затем проверить, какой из них работает на данной странице. (Обучение одному скребку на нескольких страницах не дало общего решения в моей быстрой проверке).

Scrapely может извлекать списки элементов из списков структур (например, <ul> или <ol> ) – см. Другой ответ . Однако, поскольку он извлекает контент с использованием фрагментов HTML / документа, он не может извлекать текстовые данные, содержащиеся в одном теге, без разделительных тегов ( <li></li> ), что, похоже, является тем, что вы пытаетесь сделайте здесь.

Но, если вы можете выбрать блок ингредиентов в целом, вы можете легко выполнить обработку полученных данных, чтобы получить требуемый результат. Например, в вашем примере case .split('\n')[3:-2] предоставит вам ингредиенты в следующем списке:

 ['- 50 gr de hojas de albahaca', '- 4 cucharadas (60 ml) de piñones', '- 2 - 4 dientes de ajo', '- 120 ml (1/2 vaso) de aceite de oliva virgen extra', '- 115 gr de queso parmesano recién rallado', '- 25 gr de queso pecorino recién rallado ( o queso de leche de oveja curado)'] 

Если вы хотите сделать это регулярно (или нужно добавить пост-обработку в несколько полей), вы можете подклассифицировать класс Scraper следующим образом, чтобы добавить настраиваемый метод:

 class PostprocessScraper(Scraper): def scrape_page_postprocess(self, page, processors=None): if processors == None: processors = {} result = self.scrape_page(page) for r in result: for field, items in r.items(): if field in processors: fn = processors[field] r[field] = [fn(i) for i in items] return result 

Этот новый метод scrape_page_postprocess принимает словарь постпроцессоров для выполнения по возвращенным данным, привязанным по полю. Например:

 processors = {'ingredients': lambda s: s.split('\n')[3:-2]} scrape_page_postprocess(page, processors) 
Interesting Posts