Scrapy - Простой атрибут div [@class] response.xpath не возвращает данные - PullRequest
0 голосов
/ 15 ноября 2018

Я написал некоторый код для написания HTML-ссылок из результатов поиска на самом деле. Мой начальный URL-адрес - это http-адрес, который содержит список объявлений о работе. Я пытаюсь почистить URL для каждой вакансии, показанной на странице, и название работы. Моя проблема, кажется, является атрибутом titles = response.xpath. Если я использую специфичный для работы атрибут, я получаю данные, но когда я использую атрибут, показанный ниже в моем коде, я ничего не получаю (даже заголовки столбцов). И это несмотря на то, что атрибут охватывает все, что мне нужно. Любая помощь приветствуется, так как я только начинающий.

Я вывожу в файл CSV, и я успешно использовал этот код в другом месте, поэтому мне интересно, не относится ли это к тому, как они кодировали целевую страницу URL. Это сводит меня с ума!

from scrapy.spiders import Spider
from scrapy.selector import Selector
from ICcom4.items import Scrape4Item
from scrapy.linkextractors import LinkExtractor
from scrapy.utils.response import get_base_url
from scrapy.spiders import CSVFeedSpider
import requests

class MySpider(Spider):
    name = "Scrape4"
    allowed_domains = ["indeed.co.uk"]

    start_urls = ['http://www.indeed.co.uk/jobs?as_and=a&as_phr=&as_any=&as_not=IT+construction&as_ttl=Project+Manager&as_cmp=&jt=contract&st=&salary=%C2%A310K-%C2%A3999K&radius=25&l=&fromage=2&limit=50&sort=date&psf=advsrch',]

    def parse(self, response):
        titles = response.xpath('//div[@class="jobsearch-SerpJobCard row result clickcard"]')

        items = []
        for titles in titles:
            item = Scrape4Item()
            base_url = get_base_url(response)
            home_url = ("http://www.indeed.co.uk")
            item ['_pageURL'] = base_url
            item ['role_titletext'] = titles.xpath('//h2/a/text()').extract()

            items.append(item)
        return items

Спасибо за руководство, Елена, но я боюсь, что ваши предложения не имеют значения. Я до сих пор не получаю никаких данных. Я разрешил дублирующую переменную ( для заголовков в заголовках1 ), которую я тестировал как отдельное изменение удовлетворительно. Однако другие предложения не имели никакого значения. Я также попытался запустить очистку только с запросом на возвращаемый URL, но он все еще не работал. Пересмотренный пример ниже.

from scrapy.spiders import Spider
from scrapy.selector import Selector
from ICcom4.items import Scrape4Item
from scrapy.linkextractors import LinkExtractor
from scrapy.utils.response import get_base_url
from scrapy.spiders import CSVFeedSpider
import requests

class MySpider(Spider):
    name = "Scrape4"
    allowed_domains = ["indeed.co.uk"]

    start_urls = ['http://www.indeed.co.uk/jobs?as_and=a&as_phr=&as_any=&as_not=IT+construction&as_ttl=Project+Manager&as_cmp=&jt=contract&st=&salary=%C2%A310K-%C2%A3999K&radius=25&l=&fromage=2&limit=50&sort=date&psf=advsrch',]

    def parse(self, response):
        titles1 = response.css('div.jobsearch-SerpJobCard.row.result.clickcard')
        #also tried as titles = response.css('div.jobsearch-SerpJobCard row result clickcard')

        items = []
        for titles in titles1:
            item = Scrape4Item()
            base_url = get_base_url(response)
            home_url = ("http://www.indeed.co.uk")
            item ['_pageURL'] = base_url
            item ['role_titletext'] = titles.xpath('.//h2/a/text()').extract()
        #also tried as item ['role_titletext'] = titles.css('h2 a::text').extract()
            items.append(item)
        return items

EDIT: Спасибо тебе, Тьяго. Вот и сломалось! Ты суперзвезда! Спасибо вам и Елене за терпение с новичком. Просто чтобы завершить круг для кого-то еще, окончательный код, который я использовал, работал следующим образом. Это возвращает URL страницы поиска и название работы :-);

from scrapy.spiders import Spider
from scrapy.selector import Selector
from ICcom4.items import Scrape4Item
from scrapy.linkextractors import LinkExtractor
from scrapy.utils.response import get_base_url
from scrapy.spiders import CSVFeedSpider
import requests

class MySpider(Spider):
    name = "Scrape4"
    allowed_domains = ["indeed.co.uk"]
    start_urls = ['http://www.indeed.co.uk/jobs?as_and=a&as_phr=&as_any=&as_not=IT+construction&as_ttl=Project+Manager&as_cmp=&jt=contract&st=&salary=%C2%A310K-%C2%A3999K&radius=25&l=&fromage=2&limit=50&sort=date&psf=advsrch',]

    def parse(self, response):
        titles = response.css('.jobsearch-SerpJobCard')
        items = []
        for titles in titles:
            item = Scrape4Item()
            base_url = get_base_url(response)
            home_url = ("http://www.indeed.co.uk")
            item ['_pageURL'] = base_url
            item ['role_titletext'] = title.xpath('.//h2/a/@title').extract()
        items.append(item)
        return items

1 Ответ

0 голосов
/ 16 ноября 2018

Я заметил, что в загруженном HTML-коде нет класса clickcard, но он есть после загрузки страницы.Конечно, это добавлено некоторым кодом JavaScript.Поскольку Scrapy не выполняет javascript, вы можете дважды проверить источник страницы, когда какой-то селектор неожиданно завершает работу (вместо «проверить элемент»).Кроме того, более короткий селектор типа '.jobsearch-SerpJobCard' сделает эту работу.

Что касается вопроса в заголовке, для получения данных атрибута вы можете использовать xpath('.//div/@class') или css('div::attr(class)').Например:

def parse(self, response):
    titles = response.css('.jobsearch-SerpJobCard')
    for title in titles:
        item = {}
        item['role_titletext'] = title.xpath('.//h2/a/@title').get()
        # or
        # item['role_titletext'] = title.css('h2 a::attr(title)').get()
        yield item
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...