如何从Scrapy的response中提取指定class标签的文本值
问题解决方法
错误原因排查
- 初始查询调用了
extract()方法,返回结果为HTML字符串列表,而非Scrapy Selector对象,无法继续调用XPath查询方法 - 后续编写的XPath表达式存在两处错误:一是
//[@id="raw-topic-link"]缺少节点匹配符(需补充*匹配任意节点,即写成//*),二是混淆了属性类型,目标元素的raw-topic-link是class属性值,不是id属性值。
正确实现代码
方式一:单次XPath直接提取所有标题文本
直接在初始查询中追加/text()提取节点文本,无需二次查询:
# extract() 会返回所有匹配的文本组成的列表 titles = response.xpath('//*[contains(concat(" ", @class, " "), concat(" ", "raw-topic-link", " "))]/text()').extract() # 更推荐使用Scrapy新的getall()方法,作用和extract()完全一致,语义更清晰 titles = response.xpath('//*[contains(concat(" ", @class, " "), concat(" ", "raw-topic-link", " "))]/text()').getall()
方式二:先获取元素节点再提取文本
如果你需要先拿到所有目标a标签节点做其他处理,再单独提取文本,可使用相对路径查询:
# 注意这里不要调用extract(),保留Selector对象列表 link_nodes = response.xpath('//*[contains(concat(" ", @class, " "), concat(" ", "raw-topic-link", " "))]') titles = [] for node in link_nodes: # 相对路径以./开头,代表从当前节点向下查询,不要用//开头(//会从整个文档根节点查询) title = node.xpath('./text()').get() if title: titles.append(title.strip())
相关学习资源推荐
可学习XPath官方语法标准、Scrapy官方选择器使用手册、W3C XPath教程,这些资料完整覆盖了按标签名、class属性、id属性、链接属性、文本内容等各类场景的提取方法,同时包含大量可直接复用的实操示例。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

