Python Requests HTML爬虫仅能获取标题,其余元素无法提取文本
问题根因
- 代码存在低级笔误:
s.get(urlos)中的urlos未定义,正常运行会直接抛出NameError,如果你本地能跑通说明贴出的代码和实际运行代码不一致,先修正这个变量名错误。 - 字段提取逻辑完全错误:你提取标题的方式是对元素对象的字符串返回值做切割替换,属于歪打正着刚好拿到了title属性值,完全不是requests-html设计的标准提取方式,这种写法没有可复制性,也是其他字段提取失败的核心诱因。
.text属性调用报错的直接原因:调用find()方法时未加first=True参数时,方法返回的是匹配到的所有元素组成的列表,列表对象本身没有.text属性,自然会报错;如果加了first=True仍拿不到文本,一是render等待时间过短,页面动态JS还没把价格、描述类的动态内容渲染到DOM树,只返回了带class的空标签壳;二是Kaufland的商品描述默认放在折叠手风琴组件里,未触发展开动作时组件内的文本不会加载。- 反爬拦截:默认请求头的特征太明显,站点会返回阉割版的页面结构,仅保留标题等少量静态字段,价格、描述这类动态字段全部留空,只返回空的DOM元素占位。
修复步骤
- 修正笔误,将
get方法的参数从urlos改为提前定义的url变量。 - 给会话添加真实浏览器的User-Agent请求头,绕过基础反爬校验。
- 调大
render方法的等待时长,增加页面滚动动作触发懒加载,对折叠的描述模块模拟点击展开后再提取内容。 - 全部字段统一用标准API提取:匹配单个元素时加
first=True参数,直接调用元素的.text属性拿文本内容,废弃字符串切割的野路子写法。
修正后可运行代码
from requests_html import HTMLSession url = 'https://www.kaufland.de/product/324406424/?search_value=staubsauger' session = HTMLSession() # 配置真实浏览器请求头 session.headers.update({ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", "Accept-Language": "de-DE,de;q=0.9" }) resp = session.get(url) # 延长渲染等待时间,滚动页面触发懒加载 resp.html.render(sleep=4, scrolldown=2) # 标准方式提取标题 title = resp.html.find("h1.rd-title", first=True).text.strip() # 提取价格 price = resp.html.find("span.rd-price-information__price", first=True).text.strip() # 点击展开商品描述折叠面板 desc_header = resp.html.find("div.rd-product-description__top-accordion-header", first=True) if desc_header: desc_header.click() resp.html.render(sleep=1) description = resp.html.find("div.rd-product-description__top-accordion-content-description", first=True).text.strip() print(f"商品标题:{title}") print(f"商品价格:{price}") print(f"商品描述:{description}")
注意事项
首次运行requests-html会自动下载Chromium内核,需等内核下载完成后才能正常渲染页面;如果仍出现元素不存在的报错,可将render的sleep参数调整到5-6,给JS渲染留足时间。不要依赖元素对象的字符串表示做内容提取,只要页面class、属性有微小变动,这种写法就会直接失效。
内容的提问来源于stack exchange,提问作者dsadeq32423
相关产品推荐
相关产品推荐

