Scrapy response.xpath ничего не возвращает для запроса

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

>>> scrapy shell "http://jobs.parklandcareers.com/dallas/nursing/jobid6541851-nurse-resident-cardiopulmonary-icu-feb2015-nurse-residency-requires-contract-jobs"

>>> response.xpath('//*[@id="jobDesc"]/span[1]/text()')
[<Selector xpath='//*[@id="jobDesc"]/span[1]/text()' data=u'Dallas, TX'>]
>>> response.xpath('//*[@id="jobDesc"]/span[2]/p/text()[2]')
[<Selector xpath='//*[@id="jobDesc"]/span[2]/p/text()[2]' data=u'Responsible for attending assigned nursi'>]
>>> response.xpath('//*[@id="jobDesc"]/span[2]/p/text()[preceding-sibling::*="Education"][following-sibling::*="Certification"]')
[]

Третья команда не возвращает никаких данных. Я пытался извлечь данные между двумя ключевыми словами в команде. Где я ошибаюсь?


person Abhishek    schedule 01.12.2014    source источник


Ответы (2)


//*[@id="jobDesc"]/span[2]/p/text() вернет вам список текстовых узлов. Вы можете отфильтровать соответствующие узлы в Python. Вот как можно получить текст между абзацами "Образование/Опыт:" и "Сертификация/Регистрация/Лицензия:":

>>> result = response.xpath('//*[@id="jobDesc"]/span[2]/p/text()').extract()
>>> start = result.index('Education/Experience:')
>>> end = result.index('Certification/Registration/Licensure:')
>>> print ''.join(result[start+1:end])
- Must be a graduate from an accredited school of Nursing.  

UPD (по поводу дополнительного вопроса в комментариях):

>>> response.xpath('//*[@id="jobDesc"]/span[3]/text()').re('Job ID: (\d+)')
[u'143112']
person alecxe    schedule 01.12.2014
comment
у меня есть еще один небольшой запрос в этом вопросе. Я пробовал что-то вроде этого: ››› jid=response.xpath('//*[@id=jobDesc]/span[3]/text()').extract() .... и я пытался извлечь только номер и убрать Job ID:...но запуск не работает так же..индекса не было в списке - person Abhishek; 02.12.2014
comment
@crozzfire, конечно, это хороший пример использования .re(), см. обновление в ответе. - person alecxe; 02.12.2014

Пытаться:

substring-before(
  substring-after('//*[@id="jobDesc"]/span[2]/p/text()', 'Education'), 'Certification')

Примечание: я не мог проверить это.

Идея состоит в том, что вы не можете использовать preceding-sibling и following-sibling, потому что вы просматриваете один и тот же текстовый узел. Вы должны извлечь текстовую часть, которую вы хотите, используя substring-before() и substring-after()

Комбинируя эти две функции, вы выбираете то, что находится между ними.

person M. Page    schedule 01.12.2014