使用Scrapy从表中提取数据

时间:2016-06-01 19:03:37

标签: scrapy html-table

我有这张桌子

<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找到第一次出现的文字&#34; Name&#34;并复制下一个单元格中的值(在本例中为&#34; ROG GL552JX&#34;)并找到下一个文本&#34; Name&#34;并复制价值&#34;华硕555&#34;。

我需要的结果:

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

问题是在这个表中我有两次出现的文字&#34; Name&#34;和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 个答案:

答案 0 :(得分:0)

如果您需要每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 { {1}}作为键。