使用scrapy处理相同项目字段中的不同html标记

时间:2013-10-25 16:28:25

标签: html python-2.7 scrapy

如果我的html包含一个表,其中列表示字段,行表示记录,但第一列中的一些单元格只是文本而一些是链接,如何将这些单元格转到正确的字段?我只能通过省略第一列来思考如何做到这一点。

例如:

<tbody>
<tr id="ps_134922471">
<td><a href="/114911935">184A Kent St</a></td>
<td class="center">House</td>
<td class="currency price">$600,000</td>
<td>Auction</td>
<td class="center bed">4</td>
<td class="date">19/10/13</td>
</tr>
<tr id="ps_134922515">
<td>5/189 Rockingham Beach Rd</td>
<td class="center">Unit</td>
<td class="currency price">$502,000</td>
<td>Normal Sale</td>
<td class="center bed">3</td>
<td class="date">10/09/13</td>
</tr>
等等...等等......

我讨厌的解决方案省略了第一列(恰好是街道地址):

def parse(self, response):
       hxs = HtmlXPathSelector(response)
       items = []
       item = SoldItem()
       types = hxs.select('//table[@id="recentSales"]/tbody/tr/td[@class="center"]/text()').extract()
       beds = hxs.select('//table[@id="recentSales"]/tbody/tr/td[@class="center bed"]/text()').extract()
       prices = hxs.select('//table[@id="recentSales"]/tbody/tr/td[@class="currency price"]/text()').extract()
       dates =  hxs.select('//table[@id="recentSales"]/tbody/tr/td[@class="date"]/text()').extract()
       for i in range(len(types)):
           item['type'] = types[i]
           item['bed'] = beds[i]
           item['price'] = prices[i]
           item['saledate'] = dates[i]
           items.append(item)
       return items
       pass

任何帮助表示赞赏。谢谢

1 个答案:

答案 0 :(得分:1)

我建议你循环表行tr元素。 hxs.select()将返回一个选择器列表,您可以继续在每行的上下文中使用.select()和其他相对XPath表达式。

要获取每行的第一个td单元格的文本内容,是否存在嵌套链接,您可以使用.//text()模式提取所有后代文本节点,不仅是直接的孩子(与./text()一样)

此外,您需要为循环的每次迭代实例化SoldItem() 。 尝试类似的东西:

def parse(self, response):
    hxs = HtmlXPathSelector(response)
    items = []

    rows = hxs.select('//table[@id="recentSales"]/tbody/tr)
    for row in rows:
        item = SoldItem()
        item['address'] = row.select('td[1]//text()').extract()
        item['saletype'] = row.select('td[4]/text()').extract()
        item['type'] = row.select('td[@class="center"]/text()').extract()
        item['bed'] = row.select('td[@class="center bed"]/text()').extract()
        item['price'] = row.select('td[@class="currency price"]/text()').extract()
        item['saledate'] = row.select('td[@class="date"]/text()').extract()
        items.append(item)
    return items