Scrapy XPath获取第二个keywords meta标签失败问题求助
问题出在XPath的位置谓词作用范围!
你忽略了XPath中位置索引的作用上下文——//meta[@itemprop='keywords'][2] 和 (//meta[@itemprop='keywords'])[2] 是完全不同的写法:
//meta[@itemprop='keywords'][2]的含义是:查找所有父节点下的第2个<meta>元素,且该元素的itemprop属性等于keywords。但在quotes.toscrape.com的页面里,每个带itemprop='keywords'的<meta>都是它所在父节点(每个quote的包裹div)下的第一个<meta>,根本不存在父节点下的第二个符合条件的<meta>,所以自然取不到内容。而你真正想要的是整个文档中第2个符合
//meta[@itemprop='keywords']的元素,这时候必须用括号把整个节点选择器括起来,再添加位置索引:response.xpath("(//meta[@itemprop='keywords'])[2]/@content").extract_first()
你可以验证一下:先执行response.xpath("//meta[@itemprop='keywords']")会得到一个包含多个元素的列表,用括号包裹后再取索引,才能正确定位到列表中的第2个元素(XPath索引从1开始,对应列表的索引1)。
另外补充个小技巧:如果你用extract()方法获取所有结果的列表,也可以直接通过Python的索引来取第二个元素(注意Python是0开始):
response.xpath("//meta[@itemprop='keywords']/@content").extract()[1]
这种写法有时候更直观,不容易和XPath的索引规则混淆。
内容的提问来源于stack exchange,提问作者eric5037
相关产品推荐
相关产品推荐

