Scrapy - 将表头(thead)值添加到Item Loader

时间:2013-12-29 03:16:22

标签: python scrapy

我有一个网页,其中包含我希望使用Scrapy抓取的多个表格:

<table>
   <thead>
      <tr>
         <th>
            <a>Heading1</a>
         </th>
      </tr>
      <tr>
         <th>Col1</th>
         <th>Col2</th>
         <th>Col3</th>
      </tr>
   </thead>
   <tbody>
      <tr>
         <td><a href="#">Name1</a></td>
         <td>Description1</td>
         <td>Number1</td>
      </tr>
      <tr>
         <td><a href="#">Name2</a></td>
         <td>Description2</td>
         <td>Number2</td>
      </tr>

      ...

    </tbody>
</table>

在一页上有许多类似上面的表格。

我使用Item Loader来存储循环遍历每一行的数据,抓住:

  • 名称
  • 描述

Scrapy蜘蛛如下:

class MySpider(BaseSpider):
   ...

   def parse(self, response):
      hxs = HtmlXPathSelector(response)
      tb = hxs.xpath('//table')

      for td in tb.xpath('.//tbody/tr'):
         il = WebsiteLoader(response=response, selector=td)

         il.add_xpath('name', 'td/a/text()')
         il.add_xpath('description', 'td[1]/text()')
         il.add_xpath('number', 'td[2]/text()')

         yield il.load_item()

这很好用,我可以在页面上同一个表的所有实例上填充每行数据的Item Loader。

但是,我的问题是:

  

如何在项目加载器中添加第4个字段,其中包含我每个表格的“标题”文本?

提前感谢您的帮助!


编辑

这是我目前可以获取的数据样本:

Name1 | Description1 | Number1
Name2 | Description2 | Number2
...

# and so forth for the other table instances:

Name3 | Description3 | Number3
Name4 | Description4 | Number4
...

这就是我想要的:

Name1 | Description1 | Number1 | Heading1
Name2 | Description2 | Number2 | Heading1
...

# and so forth for the other table instances:

Name3 | Description3 | Number3 | Heading2
Name4 | Description4 | Number4 | Heading2
...

1 个答案:

答案 0 :(得分:2)

我希望我理解正确,可能是这样的:

def parse(self, response):
   hxs = HtmlXPathSelector(response)
   for tb in hxs.xpath('//table'):

       heading = tb.xpath('.//thead/tr/th/a/text()').extract()[0]

       for td in tb.xpath('.//tbody/tr'):
          il = WebsiteLoader(response=response, selector=td)
          ...
          il.add_value('heading', heading)
          yield il.load_item()