今天发现2年前的爬虫接口爬取突然失败了。调试发现因为html页面结构发生了变化,导致doc.getElementsByClass方法没有获得目标元素节点。经过排除发现html中某个节点的class样式中有空格,如
<span class="pl-1 info-value">.....</span>
经过测试,解决方法如下:
1、使用doc.getElementsByAttributeValue("class","pl-1 info-value"); 来代替,建议使用这种方式
2、使用多个select来代替:比如doc.select("pl-1").select("info-value");
重要说明:
但是select方法存在一个问题,若有其他节点,形如
<span class="pl-1 info-value tred">.....</span>,则使用select方式来查询时,也会被包含进来,原因如下:
不管是select方式还是getElementsByClass方式,若class的值有空格时,像浏览器一样,jsoup在解析时认为存在多个样式pl-1和info-value,此时我们让jsoup直接去查找一个叫"pl-1 info-value"的样式就查找不到了。因为多个样式的存在,所以通过doc.select("pl-1").select("info-value")查询处理的Elements集合中可能包含形如:<tr class="pl-1 info-value"></tr> 、<span class="pl-1 info-value tred">.....</span> 、 <span class="pl-1 tred info-value font14">.....</span> 这样的节点元素。
注意:要是存在查询集合的结果过多的情况可以进一步过滤,比如要是节点名称步一样,则可以进行过滤
doc.select("span.pl-1").select("info-value")、 doc.select("tr.pl-1").select("info-value")