Пытаюсь определить, почему мой xpath не работает в Scrapy

#html #xpath #scrapy

Вопрос:

Я пытаюсь запустить Скребущего паука на таких страницах, как эта:

https://careers.mitre.org/us/en/job/R104514/Chief-Engineer-Technical-Analysis-Department

И я бы хотел, чтобы паук получил основные пункты с квалификацией и ответственностью. Я могу написать выражение xpath, которое получает именно это, и оно работает в моих браузерах:

//*/section/div/ul/li

Но когда я пытаюсь использовать скребковатую оболочку:

response.xpath("//*/section/div/ul/li")

Он возвращает пустой список. Основываясь на копировании response.text и загрузке его в браузер, кажется, что текст доступен, но я все еще не могу получить доступ к этим маркерам.

Любая помощь будет очень признательна!

Ответ №1:

Если посмотреть на страницу, на которую вы ссылаетесь, элементы списка, на которые вы ориентируетесь, на самом деле не находятся в самом ответе документа, а позже загружаются в DOM с помощью JavaScript.

Чтобы получить к ним доступ, я бы рекомендовал ознакомиться с документацией scrapy по выбору динамически загружаемого контента. Раздел, который применяется здесь, в частности, является разделом синтаксического анализа кода JavaScript.

Следуя второму примеру, мы можем использовать chompjs (вам нужно будет сначала установить его с помощью pip) для извлечения данных JavaScript, распаковки html-строки, а затем загрузить ее в scrapy для анализа. например:

 scrapy shell https://careers.mitre.org/us/en/job/R104514/Chief-Engineer-Technical-Analysis-Department
 

Затем:

 import html    # Used to unescape the HTML stored in JS
import chompjs # Used to parse the JS
javascript = response.css('script::text').get()
data = chompjs.parse_js_object(javascript)
description_html = html.unescape(data['description'])
description = scrapy.Selector(text=description_html, type="html")
description.xpath("//*/ul/li")
 

Это должно вывести нужные вам элементы списка:

 [<Selector xpath='//*/ul/li' data='<li>Ensure the strength ...