Как написать повторяющийся элемент для каждого ряда в scrapy - PullRequest
1 голос
/ 26 мая 2019

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

Источник предоставляет данные категорий, типов и URL - каждая категория содержит несколькотипов, и каждый тип имеет URL.

Я ищу, чтобы получить вывод, поддерживающий вложение данных, где каждая строка связывает категорию, тип и группировку URL.

И XLM, иВыходные данные CSV предоставляют уникальные категории, но содержат все последующие данные типа и URL в столбцах для каждой строки категории.

Источник / пример сайта:

<div class="box">
     <div class="coin-img coin-imgfile--9999 coin-img-3"></div>
     <div class="coin-heading">
     <h3>Half-Cents and Cents</h3>
</div>
<ul>
     <li><a href="/auctionprices/category/liberty-cap-half-cent-1793-1797/34">Liberty Cap Half Cent (1793-1797)</a></li>
     <li><a href="/auctionprices/category/draped-bust-half-cent-1800-1808/653">Draped Bust Half Cent (1800-1808)</a></li>
     <li><a href="/auctionprices/category/classic-head-half-cent-1809-1836/654">Classic Head Half Cent (1809-1836)</a></li>
</ul>
</div>
<div class="box">
     <div class="coin-img coin-imgfile--9999 coin-img-5"></div>
     <div class="coin-heading">
     <h3>Two and Three Cents</h3>
</div>
<ul>
     <li><a href="/auctionprices/category/two-cent-1864-1873/670">Two Cent (1864-1873)</a></li>
     <li><a href="/auctionprices/category/three-cent-silver-1851-1873/77">Three Cent Silver (1851-1873)</a></li>
     <li><a href="/auctionprices/category/three-cent-nickel-1865-1889/671">Three Cent Nickel (1865-1889)</a></li>
</ul>
</div>

Рабочий паук, собирающий все необходимые данные, но не отформатированныйпри необходимости:

import scrapy

class PCGSSpider(scrapy.Spider):
    name = "pcgs_spider"
    custom_settings = {
        'FEED_FORMAT': 'xml',
        'FEED_URI': 'pcgsspider.xml'
    }
    start_urls = ['abovesample.html']

    def parse(self, response):
        SET_SELECTOR = '.box'
        for pcgs in response.css(SET_SELECTOR):

            CAT_SELECTOR = 'h3 ::text'
            TYPE_SELECTOR = './/ul/li/a/text()'
            URL_SELECTOR = './/ul/li/a/@href'
            yield {
                    'categories': pcgs.css(CAT_SELECTOR).extract(),
                    'types': pcgs.xpath(TYPE_SELECTOR).extract(),
                    'type_url': pcgs.xpath(URL_SELECTOR).extract(),
            }

И XML, показывающий правильные данные, но не вложенный с каждым URL-адресом с его ТИПОМ, и ТИП с его КАТЕГОРИЕЙ

-<item>
-<categories>
    <value>Half-Cents and Cents</value>
</categories>
-<types>
    <value>Liberty Cap Half Cent (1793-1797)</value>
    <value>Draped Bust Half Cent (1800-1808)</value>
    <value>Classic Head Half Cent (1809-1836)</value>
</types>
-<type_url>
    <value>/auctionprices/category/lincoln-cent-wheat-reverse-1909-1958/46</value>
    <value>/auctionprices/category/lincoln-cent-modern-1959-date/47</value>
    <value>/auctionprices/category/lincoln-cent-modern-1959-date/47</value>
</type_url>
</item>

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

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

Единственный способ, которым я вижу, - это дублировать CATEGORY значение для каждой ссылки с типом и URL:

import scrapy

class PCGSSpider(scrapy.Spider):
    name = "pcgs_spider"
    custom_settings = {
        'FEED_FORMAT': 'xml',
        'FEED_URI': 'pcgsspider.xml'
    }
    start_urls = ['abovesample.html']

    def parse(self, response):
        for div_box in response.css("div.box"):
            category = div_box.css("h3 ::text").extract_first()
            for li in div_box.css("ul li"):
                yield { 'category':category,
                        'type':li.css("a ::text").extract_first(),
                        'url' :li.css("a ::attr(href)").extract_first
                      }
0 голосов
/ 26 мая 2019

Вы должны использовать метод extract_first () вместо extract () в поле категорий. Пример того, что я получил от очистки PCGS:

<items>
<item><categories>Half-Cents and Cents</categories><types>Liberty Cap Half Cent (1793-1797)</types><type_url>/auctionprices/category/liberty-cap-half-cent-1793-1797/34</type_url></item>
<item><categories>Two and Three Cents</categories><types>Two Cent (1864-1873)</types><type_url>/auctionprices/category/two-cent-1864-1873/670</type_url></item>
<item><categories>Nickels</categories><types>Shield Nickel (1866-1883)</types><type_url>/auctionprices/category/shield-nickel-1866-1883/81</type_url></item>
</items>

Надеюсь, это то, что вы искали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...