Scrapy in Python заказ экстракта с xpaths - PullRequest
0 голосов
/ 24 апреля 2020

Я удаляю некоторый текст со страницы с пауком в Python, и на выходе получается файл .csv. Все нормально, кроме порядка некоторых записей, в файле .csv он генерирует в другом порядке, что я положил в spider.py:

Вот что я получаю:

![enter image description here

Но это тот порядок, который мне нужен и который я передаю в spider.py (строки с цветами инвертированы):

enter image description here

Я не знаю, почему не соблюдается порядок удаления данных. По какой-то причине он соблюдает тот же порядок, в котором данные появляются на веб-странице, но если я передаю их в другом порядке, чем веб-страница, почему паук игнорирует меня?

Мой код:

import scrapy
from scrapy.spiders import Spider
from scrapy.linkextractors import LinkExtractor
from scrapy.exceptions import CloseSpider
from verbos.items import MercadoItem

class MercadoSpider(scrapy.Spider):
name = 'verbos'
allowed_domain = ['www.pt.bab.la']
print("Ingrese un verbo:")
variable = input()
start_urls = ['https://pt.bab.la/verbo/portugues/' + variable]


def parse(self, response):

    eu = response.xpath('//*[@id="conjFull"]/div[2]/div/div[2]/div[1]/div[2]/text() | //*[@id="conjFull"]/div[2]/div/div[4]/div[1]/div[2]/text() | //*[@id="conjFull"]/div[2]/div/div[3]/div[1]/div[2]/text() | //*[@id="conjFull"]/div[2]/div/div[5]/div[1]/div[2]/text() | //*[@id="conjFull"]/div[2]/div/div[6]/div[1]/div[2]/text() | //*[@id="conjFull"]/div[2]/div/div[8]/div[1]/div[2]/text() | //*[@class="content-column"]/div[3]/div[1]/div[1]/div[2]/div[1]/div[2]/text() | //*[@class="content-column"]/div[3]/div[1]/div[1]/div[3]/div[1]/div[2]/text() | //*[@class="content-column"]/div[6]/div[1]/div[1]/div[2]/div[1]/div[2]/text() | //*[@class="content-column"]/div[5]/div[1]/div[1]/div[2]/div[1]/div[2]/text()').extract()
    voce = response.xpath('//*[@id="conjFull"]/div[2]/div/div[2]/div[3]/div[2]/text() | //*[@id="conjFull"]/div[2]/div/div[4]/div[3]/div[2]/text() | //*[@id="conjFull"]/div[2]/div/div[3]/div[3]/div[2]/text() | //*[@id="conjFull"]/div[2]/div/div[5]/div[3]/div[2]/text() | //*[@id="conjFull"]/div[2]/div/div[6]/div[3]/div[2]/text() | //*[@id="conjFull"]/div[2]/div/div[8]/div[3]/div[2]/text() | //*[@class="content-column"]/div[3]/div[1]/div[1]/div[2]/div[3]/div[2]/text() | //*[@class="content-column"]/div[3]/div[1]/div[1]/div[3]/div[3]/div[2]/text() | //*[@class="content-column"]/div[6]/div[1]/div[1]/div[2]/div[1]/div[2]/text() | //*[@class="content-column"]/div[5]/div[1]/div[1]/div[2]/div[1]/div[2]/text()').extract()
    nos = response.xpath('//*[@id="conjFull"]/div[2]/div/div[2]/div[4]/div[2]/text() | //*[@id="conjFull"]/div[2]/div/div[4]/div[4]/div[2]/text() | //*[@id="conjFull"]/div[2]/div/div[3]/div[4]/div[2]/text() | //*[@id="conjFull"]/div[2]/div/div[5]/div[4]/div[2]/text() | //*[@id="conjFull"]/div[2]/div/div[6]/div[4]/div[2]/text() | //*[@id="conjFull"]/div[2]/div/div[8]/div[4]/div[2]/text() | //*[@class="content-column"]/div[3]/div[1]/div[1]/div[2]/div[4]/div[2]/text()  | //*[@class="content-column"]/div[3]/div[1]/div[1]/div[3]/div[4]/div[2]/text() | //*[@class="content-column"]/div[6]/div[1]/div[1]/div[2]/div[1]/div[2]/text() | //*[@class="content-column"]/div[5]/div[1]/div[1]/div[2]/div[1]/div[2]/text()').extract()
    voces = response.xpath('//*[@id="conjFull"]/div[2]/div/div[2]/div[6]/div[2]/text() | //*[@id="conjFull"]/div[2]/div/div[4]/div[6]/div[2]/text() | //*[@id="conjFull"]/div[2]/div/div[3]/div[6]/div[2]/text() | //*[@id="conjFull"]/div[2]/div/div[5]/div[6]/div[2]/text() | //*[@id="conjFull"]/div[2]/div/div[6]/div[6]/div[2]/text() | //*[@id="conjFull"]/div[2]/div/div[8]/div[6]/div[2]/text() | //*[@class="content-column"]/div[3]/div[1]/div[1]/div[2]/div[6]/div[2]/text()  | //*[@class="content-column"]/div[3]/div[1]/div[1]/div[3]/div[6]/div[2]/text() | //*[@class="content-column"]/div[6]/div[1]/div[1]/div[2]/div[1]/div[2]/text() | //*[@class="content-column"]/div[5]/div[1]/div[1]/div[2]/div[1]/div[2]/text()').extract()

    for item in zip(eu, voce, nos, voces):
        scraped_info = {
            'eu' : item[0],
            'voce' : item[1],
            'nos' : item[2],
            'voces' : item[3],
        }

        yield scraped_info

items.py:

import scrapy


class MercadoItem(scrapy.Item):
eu = scrapy.Field()
voce = scrapy.Field()
nos = scrapy.Field()
voces  = scrapy.Field()

settings.py:

BOT_NAME = 'verbos'

SPIDER_MODULES = ['verbos.spiders']
NEWSPIDER_MODULE = 'verbos.spiders'

ITEM_PIPELINES = {'verbos.pipelines.MercadoPipeline': 500}
FEED_FORMAT = "csv"
FEED_URI = 'verbos_items.csv'
FEED_EXPORT_ENCODING='cp1252'

ROBOTSTXT_OBEY = False

1 Ответ

0 голосов
/ 24 апреля 2020

Выражения XPath определяют только совпадения, а не порядок.

Вместо использования одного выражения XPath, итерируйте каждое выражение XPath в нужном порядке в al oop.

Итак, измените:

words = response.xpath('xpath1 | xpath2').getall()
for word in words:
    yield {'word': word}

Кому:

for xpath in ('xpath1', 'xpath2'):
    words = response.xpath(xpath).getall()
    for word in words:
        yield {'word': word}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...