Извлечение данных из таблицы с помощью Scrapy

У меня есть этот стол

<table class="specs-table"> 
  <tbody> 
    <tr> 
      <td colspan="2" class="group">Sumary</td> 
    </tr> 
    <tr> 
      <td class="specs-left">Name</td> 
      <td class="specs-right">ROG GL552JX   </td> 
    </tr> 
    <tr class="noborder-bottom"> 
      <td class="specs-left">Category</td> 
      <td class="specs-right">Gaming    </td> 
    </tr> 
    <tr> 
      <td colspan="2" class="group">Technical Details</td> 
    </tr> 
    <tr> 
      <td class="specs-left">Name</td> 
      <td class="specs-right">Asus 555 </td>
      </tr> 
    <tr> 
      <td class="specs-left">Resolution </td> 
      <td class="specs-right">1920 x 1080 pixels </td>
    </tr>  
    <tr class="noborder-bottom"> 
      <td class="specs-left"> Processor </td> 
      <td class="specs-right"> 2.1 GHz  </td> 
    </tr>  
  </tbody> 
</table>

Из этой таблицы я хочу, чтобы мой Scrapy нашел первое вхождение текста "Имя" и скопировал значение из следующей ячейки (в данном случае "ROG GL552JX"), а также нашел следующее вхождение текста "Имя" и скопировал значение "Asus 555".

Результат мне нужен:

'Name': [u'Asus 555'],
'Name': [u'Asus 555'],

Проблема в том, что в этой таблице у меня есть два вхождения текста "Имя", и Scrapy копирует значение обоих вхождений.

Мой результат:

'Name': [u'ROG GL552JX', u'Asus 555'],

Мой бот:

def parse(self, response):
    next_selector = response.xpath('//*[@aria-label="Pagina urmatoare"]//@href')
    for url in next_selector.extract():
        yield Request(urlparse.urljoin(response.url, url))

    item_selector = response.xpath('//*[contains(@class, "pb-name")]//@href')
    for url in item_selector.extract():
        yield Request(urlparse.urljoin(response.url, url), callback=self.parse_item)


def parse_item(self, response):
    l = ItemLoader(item = PcgItem(), response=response, )

    l.add_xpath('Name', 'Name', '//tr/td[contains(text(), "Name")]/following-sibling::td/text()',', MapCompose(unicode.strip, unicode.title))
    return l.load_item()

Как я могу решить эту проблему? Спасибо

1 ответ

Если вам нужен предмет в Nameтогда вы должны сделать что-то вроде:

for sel in response.xpath('//tr/td[contains(text(), "Name")]/following-sibling::td/text()'):
    l = ItemLoader(...)
    l.add_value('Name', sel.extract_first())
    ...
    yield l.load_item()

Теперь, если вы хотите, чтобы все это было внутри элемента, я бы рекомендовал оставить все как есть (список), потому что scrapy.Item это словарь, поэтому вы не сможете иметь 2 Name в качестве ключей.

Другие вопросы по тегам