Scrapy - xpath - экстракт возвращает ноль - PullRequest
0 голосов
/ 03 ноября 2018

Моя цель - создать скребок, который будет извлекать данные из таблицы этого сайта .

Изначально я следовал учебнику по Scrapy , в котором мне удалось извлечь данные с тестовой площадки. Когда я пытаюсь скопировать его для Bitinfocharts, первая проблема заключается в том, что мне нужно использовать xpath, который подробно не рассматривается в учебнике (они используют только css). Мне удалось очистить определенные данные, которые я хочу, через оболочку.

  • Моя текущая проблема - понимание, как я могу вычеркнуть их все из своего кода и в то же время записать результаты в файл .csv / .json?

Я, наверное, упускаю что-то совершенно очевидное. Если вы посмотрите на мой код и дадите мне знать, что я делаю неправильно, я был бы очень признателен.

Спасибо!

Первая попытка:

import scrapy

class RichlistTestItem(scrapy.Item):
    # overview details
    wallet = scrapy.Field()
    balance = scrapy.Field()
    percentage_of_coins = scrapy.Field()

class QuotesSpider(scrapy.Spider):
    name = "quotes"
    allowed_domain = ['https://bitinfocharts.com/']
    start_urls = [
        'https://bitinfocharts.com/top-100-richest-vertcoin-addresses.html'
    ]

    def parse(self, response):
        for sel in response.xpath("//*[@id='tblOne']/tbody/tr/"):            
            scrapy.Item in RichlistTestItem()
            scrapy.Item['wallet'] = sel.xpath('td[2]/a/text()').extract()[0]
            scrapy.Item['balance'] = sel.xpath('td[3]/a/text').extract()[0]
            scrapy.Item['percentage_of_coins'] = sel.xpath('/td[4]/a/text').extract()[0]

            yield('wallet', 'balance', 'percentage_of_coins')

Вторая попытка: (вероятно, ближе к 50-й попытке)

import scrapy

class RichlistTestItem(scrapy.Item):
    # overview details
    wallet = scrapy.Field()
    balance = scrapy.Field()
    percentage_of_coins = scrapy.Field()

class QuotesSpider(scrapy.Spider):
    name = "quotes"
    allowed_domain = ['https://bitinfocharts.com/']
    start_urls = [
        'https://bitinfocharts.com/top-100-richest-vertcoin-addresses.html'
    ]

    def parse(self, response):
        for sel in response.xpath("//*[@id='tblOne']/tbody/tr/"):            
            wallet = sel.xpath('td[2]/a/text()').extract()
            balance = sel.xpath('td[3]/a/text').extract()
            percentage_of_coins = sel.xpath('/td[4]/a/text').extract()

            print(wallet, balance, percentage_of_coins)

1 Ответ

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

Я исправил вашу вторую пробную версию, а именно приведенный ниже фрагмент кода

for sel in response.xpath("//*[@id=\"tblOne\"]/tbody/tr"):                                                                                                                                                            
    wallet = sel.xpath('td[2]/a/text()').extract()                                                                                                                                                                    
    balance = sel.xpath('td[3]/text()').extract()                                                                                                                                                                     
    percentage_of_coins = sel.xpath('td[4]/text()').extract()   

Я обнаружил следующие проблемы:

  • был завершающий символ "/" для селектора строк таблицы.
  • для баланса значение было внутри td, а не внутри ссылки внутри td
  • для percetag .. снова значение было внутри тд.

Также есть свойство data-val для каждого из тд. Очистить их может быть немного проще, чем получить значение изнутри td.

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