htmlunit爬取网页iframe标签里的内容

昨天经过网友介绍接了个小小的私活,大概是爬取某个学校的教务系统里的个人课表。

价格不是很高,但聊胜于无,外加上这几天确实无事可做,就接了。

初期看需求就是通过登录然后获取课表,就想到了htmlunit,毕竟我也有经验,可以说轻车熟路了,经过解析也算顺利登录并到达个人页面,只是很快就遇到第一个难题,跳转课表页面。

不同于登录时提供了表单以及button,个人界面里切换课表的页面,是一个li标签,下面尽管有个a标签,但很可惜a标签内并没有href,那应该就是使用js来获取的了,js里写了对其点击的监听,不过很容易就获得了进入课表的域名,并成功进入课表页面。

之后则是在课表页面这里卡住了。

因为无论我怎么打印当前页面,都看不到课表出现在打印的信息里,我非常好奇,就将这个网页给保存成了文件,然后用Chrome打开,发现这网页内的课表部分全部消失了。

仔细看网站源码可以发现,消失的部分其实是在iframe标签下,我估摸着应该就是这个原因了。

不过幸好,htmlunit提供了获取iframe标签页面的方法,就是它。

 List<FrameWindow> windows = html.getFrames();//获取iframe标签

这个方法可以获取当前页面所有的iframe标签,因为这个网页里就只有这一个标签,所以很容易就拿到了。

但之后又有个令人脑阔疼的难题,这个标签下所有中文都是乱码,哪怕我在浏览器的开发者模式看也一样是乱码,不知道浏览器是怎么把它给转成正常文字的。

不过幸好这个网站还算人性,提供了四种下载方案,分别是Excel,Word,PDF以及TXT,通过对其js解析很容易就拿到了下载链接,之后用

this.webClient.getPage(download_link);

拿到下载页面,再从这个页面获取inputstream,保存在本地即可。

呼,说实话这个活并不难,只是乱码部分是真的让我懵逼,至今无解,或许在某天,我会弄清楚这个,并记录下来。

2月15日更新

我网友解决了这个问题,乱码。

他的解决方案如下。

首先是编码,他测试得到这个网站的编码是utf-8,但是课表这个iframe里的编码很乱,有时是utf-8,有时又是iso-8859-1,索性就直接alt 设置了这两种编码格式。

但是后来发现打印的时候空格会被打印成方块问号,后来索性直接把方块问号替换为空字符,于是搞定了乱码。

我:????

不管怎样,能解决这个奇葩的问题就已经很不错了,虽然他不同意让我把解决方案写博客,但不好意思还是写了,希望他看到了以后不要打我。

暂无评论
发表新评论