您好我想问一个问题
我用xpath抓了一个网站,结果是这样的:
[u'<tr>\r\n
<td>address1</td>\r\n
<td>phone1</td>\r\n
<td>map1</td>\r\n
</tr>',
u'<tr>\r\n
<td>address1</td>\r\n
<td>telephone1</td>\r\n
<td>map1</td>\r\n
</tr>'...
u'<tr>\r\n
<td>address100</td>\r\n
<td>telephone100</td>\r\n
<td>map100</td>\r\n
</tr>']
现在我需要使用xpath再次分析这个结果
我想保存第一个地址,第二个保存到电话,最后一个保存到地图
但我无法得到它。
请指导我。谢谢!
这是代码,这是错误的。它会抓住另一件事。
store = sel.xpath("")
for s in store:
address = s.xpath("//tr/td[1]/text()").extract()
tel = s.xpath("//tr/td[2]/text()").extract()
map = s.xpath("//tr/td[3]/text()").extract()
答案 0 :(得分:4)
正如您在scrappy documentation中看到的那样,使用相对XPath,您必须使用.//
表示法来提取相对于前一个XPath的元素,如果不是,您将再次获取所有元素整个文件。您可以在我上面引用的碎片文档中看到此示例:
例如,假设您要提取
<p>
元素内的所有<div>
元素。首先,您将获得所有<div>
元素:
divs = response.xpath('//div')
首先,您可能会尝试使用以下方法,这是错误的,因为它实际上从文档中提取所有
<p>
元素,而不仅仅是<div>
个元素中的元素:
for p in divs.xpath('//p'):
#这是错误的 - 从整个文档中获取所有<p>
这是正确的方法(请注意
.//p
XPath前缀的点:中的所有
for p in divs.xpath('.//p'):
#提取<p>
所以我认为在你的情况下你的代码必须是这样的:
for s in store:
address = s.xpath(".//tr/td[1]/text()").extract()
tel = s.xpath(".//tr/td[2]/text()").extract()
map = s.xpath(".//tr/td[3]/text()").extract()
希望这有帮助,