#python #web-scraping #scrapy
#python #очистка веб-страниц #scrapy
Вопрос:
У меня возникли некоторые проблемы при сканировании этого веб-сайта:
Я пытаюсь извлечь эти элементы из поиска вакансий 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"]')
(удалите вторую кавычку)