You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

requests-html设置first=True无法仅返回目标元素的问题

问题现象

使用requests-html库爬取迪士尼实习招聘页面目标元素时,调用find方法已传入first=True参数,但执行print打印元素text属性时,程序并未单独返回选中的目标元素内容,反而输出了从该选中元素起始位置开始的整页所有内容。
复现代码如下:

from requests_html import HTMLSession


url = "https://jobs.disneycareers.com/job/orlando/wdi-estimating-internship-orlando-fall-2022/391/30101898544"
s = HTMLSession()
r = s.get(url)
r.html.render(sleep=1)


internship_title = r.html.find("h1#job-title-scrape", first=True)
print(internship_title.text)
故障原因

该问题和first=True参数无关,这个参数的作用仅为返回匹配CSS选择器的第一个元素,不会修正DOM结构解析错误。
出现文本溢出的核心原因是目标招聘页面的HTML结构存在未闭合的<h1 id="job-title-scrape">标签,requests-html底层的HTML解析器会默认将该未闭合标签起始位置到页面末尾的所有DOM节点,都识别为这个h1元素的子节点,因此调用.text属性时会拉取到后续整页的文本内容。

解决方案
  • 方案1:绕过DOM结构解析,直接用字符串匹配提取目标内容。使用requests-html自带的search方法做模板匹配,不受标签未闭合问题影响,示例代码:
    # 替换原来的find+print逻辑
    title = r.html.search('<h1 id="job-title-scrape">{}</h1>')[0]
    print(title.strip())
    
  • 方案2:调用pyppeteer原生DOM API提取内容。渲染页面时保留page实例,直接通过浏览器原生JS取目标元素的文本,完全规避本地解析器的结构识别误差,示例代码:
    from requests_html import HTMLSession
    url = "https://jobs.disneycareers.com/job/orlando/wdi-estimating-internship-orlando-fall-2022/391/30101898544"
    s = HTMLSession()
    r = s.get(url)
    r.html.render(sleep=1, keep_page=True)
    # 直接在浏览器上下文中执行JS取文本
    title = r.html.page.evaluate('() => document.querySelector("h1#job-title-scrape").textContent')
    print(title.strip())
    
  • 方案3:缩小选择器定位范围。定位时带上目标h1的父容器选择器,减少未闭合标签导致的解析溢出范围,再对提取到的长文本做截断,取第一行有效内容即可。

内容的提问来源于stack exchange,提问作者Kyle Roark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 10:21:26