результат xpath из scrapy не показывает тот же результат на html-странице

#python #web-scraping #scrapy

#python #очистка веб-страниц #scrapy

Вопрос:

У меня возникли некоторые проблемы при сканировании этого веб-сайта:

https://www.simplyhired.com/search ?q= data engineeramp;l= United Statesamp;pn=1amp;job=ZMzeXt6JW0jMuZc6H-3Af3sqOGzeQMLj7X5mnXXv9ZteeAoGm6oDdg

Я пытаюсь извлечь эти элементы из поиска вакансий de SimplyHired для инженера по обработке данных в США:

введите описание изображения здесь

Но когда я пытаюсь использовать xpath locator для любого из них, используя модуль selector, я получаю разные результаты и в другом порядке.

Также выходные данные для всех из них не совпадают (например, индекс, соответствующий имени задания xpath, не совпадает с индексом для местоположения в расположении xpath).

Вот мой код:

 from scrapy import Selector
import requests

response = requests.get('https://www.simplyhired.com/search?q=data engineeramp;l=united statesamp;mi=exactamp;sb=ddamp;pn=1amp;job=X1yGOt2Y8QTJm0tYqyptbgV9Pu19ge0GkVZK7Im5WbXm-zUr-QMM-A').content

sel=Selector(text=response)

#job name
sel.xpath('//main[@id="job-list"]/div/article[contains(@class,"SerpJob")]/div/div[@class="jobposting-title-container"]/h2/a/text()').extract()

#company
sel.xpath('//main[@id="job-list"]/div/article/div/h3[@class="jobposting-subtitle"]/span[@class="JobPosting-labelWithIcon jobposting-company"]/text()').extract()

#location
sel.xpath('//main[@id="job-list"]//div/article/div/h3[@class="jobposting-subtitle"]/span[@class="JobPosting-labelWithIcon jobposting-location"]/span/span/text()').extract()

#salary estimates
sel.xpath('//main[@id="job-list"]//div/article/div/div[@class="SerpJob-metaInfo"]//div[@class="SerpJob-metaInfoLeft"]/span/text()[2]').extract()
  

Ответ №1:

Я не совсем уверен, пытаетесь ли вы использовать Scrapy или requests. Похоже, вы хотите использовать запросы, но с селекторами xpath.

Для сайтов, подобных этому, лучше всего рассматривать каждое отдельное объявление о работе как «карточку». Вы хотите перебирать каждую карту с помощью селекторов XPATH, которые вам нужны для получения нужных данных.

Пример кода

 card = sel.xpath('//div[@class="SerpJob-jobCard card"]')
for a in card:
    title = a.xpath('.//a[@class="card-link"]/text()').get()
    company = a.xpath('.//span[@class="JobPosting-labelWithIcon jobposting-company"]/text()').get() 
    salary = a.xpath('.//span[@class="jobposting-salary"]/text()').get()
    location = a.xpath('.//span[@class="jobposting-location"]/text()').get()
  

Объяснение

Вы хотите выполнить поиск по каждой карте с помощью относительных селекторов XPATH. .// Поиск в фрагменте HTML ниже по потоку card переменной.

Всегда используйте get() вместо extract() . get() используется для получения одного значения и всегда возвращает строку, вот что нам нужно, когда мы перебираем каждую карточку. extract() извлекает все значения, если их несколько, и если для селектора XPATH есть только одно значение, он помещает его в список, который часто не соответствует вашему желанию. Неоднозначность extract() не идеальна, если вы хотите использовать несколько значений getall() , это явно и даст вам только несколько значений.

Дополнительная информация

Если вы обнаруживаете, что не получаете правильные данные в правильном формате, всегда проверяйте, добавляется ли на веб-сайт содержимое javascript. Отключите javascript вашего браузера, чтобы обновить страницу. На этом конкретном сайте ни одна из требуемых вам данных не загружается javascript, это значительно упрощает очистку.

Комментарии:

1. card = sel.xpath('//div[@class="SerpJob-jobCard card"]') (удалите вторую кавычку)