HTMLSession爬取Ask搜索结果报Pseudo-elements不支持错误
报错原因
- 抛出
Pseudo-elements are not supported错误的直接原因是:你在find()方法的CSS选择器参数中写了::text伪元素,requests-html底层依赖的cssselect库不支持解析CSS选择器中的伪元素,直接触发解析异常。 - 终端打印200状态码说明页面请求已经成功,问题完全出在元素提取的语法写法上,和你使用的Edge浏览器、网络连通性都没有关系。
修复方法
::text不是标准CSS选择器语法,是部分爬虫框架自定义的扩展语法,在requests-html中取元素文本不需要写在选择器里:先通过标准CSS选择器匹配到目标元素,再直接调用元素对象的.text属性即可获取文本内容。
修正后的可运行代码:
from requests_html import HTMLSession class Scraper(): def scrapedata(self,tag): url = f'https://www.ask.com/web?q={tag}' s = HTMLSession() r = s.get(url) print(r.status_code) qlist = [] ask = r.html.find('div.PartialSearchResults-item') for a in ask: # 移除选择器中的::text,匹配到元素后直接取text属性 title_link = a.find('a.PartialSearchResults-item-title-link.result-link', first=True) # 增加非空判断,避免个别结果结构异常触发空值报错 if title_link: title = title_link.text.strip() print(title) qlist.append(title) return qlist if __name__ == "__main__": ask = Scraper() ask.scrapedata('ferrari')
补充提示
- 如果需要提取元素属性(比如搜索结果的跳转链接),同样不需要伪元素,匹配到元素后通过
.attrs['属性名']获取即可,例如取链接就写title_link.attrs['href']。 - 如果后续遇到动态加载的内容拿不到的情况,可以调用
r.html.render()用内置的浏览器内核渲染页面后再提取元素。
内容的提问来源于stack exchange,提问作者keni
相关产品推荐
相关产品推荐

