在 Scrapy 中调用 .getall() 会将 CSS 选择器结果转为字符串列表,导致后续无法链式调用 .css() —— 正确做法是保留 Selector 对象,避免过早提取。
在 scrapy 中调用 `.getall()` 会将 css 选择器结果转为字符串列表,导致后续无法链式调用 `.css()` —— 正确做法是保留 selector 对象,避免过早提取。
当你在 Scrapy Shell(或爬虫代码)中执行如下代码时:
Article = response.css('.article-main').getall()
Art = Article[0]
Art.css('.art2-amp::text').get() # ❌ 报错:'str' object has no attribute 'css'
会触发 AttributeError: 'str' object has no attribute 'css'。根本原因在于:.getall() 返回的是纯字符串(list[str]),而字符串对象不具备 Scrapy 的选择器方法(如 .css()、.xpath()、.get() 等)。这些方法仅适用于 Selector 或 SelectorList 对象。
✅ 正确写法是:全程操作 Selector 对象,直到最后才提取内容:
# ✅ 正确:保持为 SelectorList,再取单个 Selector
articles = response.css('.article-main') # 返回 SelectorList
first_article = articles[0] # 返回单个 Selector 对象
result = first_article.css('.art2-amp::text').get() # ✅ 可正常调用 css()
你也可以链式书写,更简洁清晰:
result = response.css('.article-main').xpath('./.art2-amp//text()').get()
# 或等价地(推荐 CSS)
result = response.css('.article-main .art2-amp::text').get()
? 提示:若需遍历多个 .article-main 并分别提取子元素,应使用 for 循环作用于 SelectorList:
for article in response.css('.article-main'): title = article.css('h1::text').get() content = article.css('.art2-amp::text').get() print(title, content)
⚠️ 注意事项:
- .get() 和 .getall() 是提取方法,调用后返回 str 或 list[str],不可再接选择器操作;
- .css() / .xpath() 是选择器方法,输入为 CSS/XPath 表达式,输出为新的 SelectorList;
- 调试时可用 type(obj) 快速确认对象类型:type(response.css('...')) 应为
,而 type(response.css('...').getall()) 为 。
总结:Scrapy 的选择器设计遵循“延迟提取”原则——先筛选(.css())、再定位(索引或嵌套选择)、最后提取(.get()/.getall())。牢记这一流程,即可避免绝大多数 AttributeError。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










