Scrapy XPath селектор

Я очищаю этот сайт, и я использую Scrapy в качестве средства. Однако у меня проблемы с XPath. Я не совсем уверен, что происходит:

Почему это работает:

def parse_item(self, response):
    item = BotItem()

    for title in response.xpath('//h1'):
        item['title'] = title.xpath('strong/text()').extract()
        item['wage'] = title.xpath('span[@class="price"]/text()').extract()
        yield item

и следующий код нет?

def parse_item(self, response):
    item = BotItem()

    for title in response.xpath('//body'):
        item['title'] = title.xpath('h1/strong/text()').extract()
        item['wage'] = title.xpath('h1/span[@class="price"]/text()').extract()
        yield item

Я также хочу извлечь XPath для:

//div[@id="description"]/p

Но я не могу, потому что он находится за пределами h1узла. Как я могу это достичь? Мой полный код:

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

from bot.items import BotItem


class MufmufSpider(CrawlSpider):
    name = 'mufmuf'
    allowed_domains = ['mufmuf.ro']
    start_urls = ['http://mufmuf.ro/locuri-de-munca/joburi-in-strainatate/']

    rules = (
        Rule(
            LinkExtractor(restrict_xpaths='//div[@class="paginate"][position() = last()]'), 
            #callback='parse_start_url', 
            follow=True
        ),
        Rule(
            LinkExtractor(restrict_xpaths='//h3/a'), 
            callback='parse_item', 
            follow=True
        ),

    def parse_item(self, response):
        item = BotItem()

        for title in response.xpath('//h1'):
            item['title'] = title.xpath('strong/text()').extract()
            item['wage'] = title.xpath('span[@class="price"]/text()').extract()
            #item['description'] = title.xpath('div[@id="descirption"]/p/text()').extract()
            yield item

python,xpath,scrapy,

0

Ответов: 1


4 принят

Этот h1параметр не работает, потому что ваши выражения XPath в цикле заставляют его искать bodyэлемент непосредственно внутри элемента.def parse_item(self, response): item = BotItem() item["title"] = response.xpath('//h1/strong/text()').extract() item["wage"] = response.xpath('//h1/span[@class="price"]/text()').extract() item["description"] = response.xpath('//div[@id="description"]/p/text()').extract() return item

Более того, поскольку для извлечения только одного желаемого объекта вам вообще не нужен цикл:

description

(это также должно ответить на ваш второй вопрос о description)

питон, XPath, SCRAPY,
Похожие вопросы