如果我的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
任何帮助表示赞赏。谢谢
答案 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