Избегайте дублирования значений при скрининге

Luis Ramon Ramirez Rodriguez спросил: 28 марта 2018 в 03:48 в: python

Я сбрасываю данные MOOCs на страницах обсуждения курса, и у меня возникают проблемы с очисткой некоторых полей, E.G. Название университета.

Из приведенной выше ссылки я хочу получить: Технологический институт Массачусетса

Это xpath, который я использую для этого поля:

response.xpath('//*[@class="course-info__school__name"]//text()').extract()

Проблема заключается в том, что я получаю от него дублирующиеся значения и пустые строки:

[u'\n            ',
 u'University:\xa0',
 u'\n            Massachusetts Institute of Technology\n        ',
 u'\n            ',
 u'University:\xa0',
 u'\n            Massachusetts Institute of Technology\n        ']

2 ответа

Есть решение
ndpu ответил: 28 марта 2018 в 09:39

Вы можете пропустить внутренний span, используя функцию not (для исключения внутреннего дочернего узла диапазона) и функцию normalize-space, чтобы пропустить только пробельные текстовые строки и чистый текст:

//*[@class="course-info__school__name"]/text()[not(self::span)][normalize-space()]

В результате вы должны получить две одинаковые строки только с названием университета:

[u'Massachusetts Institute of Technology',
 u'Massachusetts Institute of Technology']

И вы можете использовать python , чтобы получить только уникальные имена:

>>> l = [u'Massachusetts Institute of Technology',
...      u'Massachusetts Institute of Technology']
>>> set(l)
set([u'Massachusetts Institute of Technology'])

Если вам нужно только содержимое первого div, вы можете получить его по индексу 1 с помощью только xpath:

(//*[@class="course-info__school__name"])[1]/text()[not(self::span)][normalize-space()]
ujhuyz0110 ответил: 28 марта 2018 в 05:04

Причина заключается в том, что есть два элемента div с именем класса course-info__school__name.

Поэтому, чтобы избежать дублирования, вы можете изменить xpath так, чтобы он выбирал только первый элемент div с именем класса course-info__school__name

response.xpath('(//div[@class="course-info__school__name"])[1]//text()').extract()

, который даст вам результат

['\n            ', 
 'University:\xa0', 
 '\n            Massachusetts Institute of Technology\n        ']

Надеюсь, это поможет!