我有这张桌子
<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()
我该如何解决这个问题? 谢谢
答案 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}}作为键。