#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 ...