使用Jsoup提取BBC足球新闻正文时出现选择器解析错误的原因
Jsoup选择器解析失败的原因及解决方法
问题背景
使用Jsoup提取BBC足球新闻正文时,编写的选择器无法被解析,抛出SelectorParseException异常。代码中尝试通过包含特殊字符的类名定位div标签,选择器语句为:
div.qa-story-body.story-body.gel-pica.gel-10/12@m.gel-7/8@l.gs-u-ml0@l.gs-u-pb++ span
解析失败的核心原因
Jsoup遵循CSS选择器语法规则,而你使用的类名中包含/和++这类CSS选择器特殊字符:
/在CSS选择器中用于表示父子元素关系(如div/p),解析器遇到gel-10/12@m里的/时,会误将其当成选择器语法的分隔符,导致解析流程中断。++属于CSS选择器的特殊符号,同样会被解析器识别为语法指令,而非类名的组成部分。
这种情况下,解析器无法正确识别这些带特殊字符的类名,直接抛出解析异常。
可行的解决方法
1. 使用属性选择器匹配完整class属性
通过[class="完整类名"]的方式直接匹配div的class属性值,绕开特殊字符的解析问题:
Elements spans = document.select("div[class=\"qa-story-body story-body gel-pica gel-10/12@m gel-7/8@l gs-u-ml0@l gs-u-pb++\"] span");
2. 转义特殊字符
对类名中的特殊字符用\转义(Java字符串中需要写双反斜杠\\),让解析器将其视为类名的一部分:
Elements spans = document.select("div.qa-story-body.story-body.gel-pica.gel-10\\/12@m.gel-7\\/8@l.gs-u-ml0@l.gs-u-pb\\+\\+ span");
3. 简化选择器(推荐)
如果qa-story-body是新闻正文div独有的类名,可以直接用这个类定位,无需带上所有复杂类名:
Elements spans = document.select("div.qa-story-body span");
内容的提问来源于stack exchange,提问作者Robbie
相关产品推荐
相关产品推荐

