Извлечение данных из таблицы с помощью 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
в качестве ключей.