我有一个网页,其中包含我希望使用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
...
答案 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()