如何使用工具获取动态HTML页面内容

如何使用工具获取动态HTML页面内容

我们知道jsoup可以用来获取HTML页面并且分析读取页面内容。
例如:

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class Test {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        Document doc = Jsoup.connect("http://www.XXX.com/path/to/page.htm").get();
        System.out.println(doc.title());
        Elements newsHeadlines = doc.select("#mp-itn b a");
        for (Element headline : newsHeadlines) {
            System.out.printf("%s\n\t%s", 
            headline.attr("title"), headline.absUrl("href"));
        }
    }
}

但是jsoup有一个缺点,即只能访问静态页面,对于动态页面,包括动态加载的元素jsoup无法处理;原因是有些网页为了浏览器的显示效果增加用户体检,并不是一次生成整个页面,而是在页面基本框架显示出来后,使用js/ajax技术动态的刷新填充页面,对于这种页面,简单地说需要解析HTML页面,执行JS代码才能完成整个页面的加载;换句话说就是需要尽可能的模拟浏览器的加载行为。

最近发现HtmlUnit可以支持这个功能。
http://htmlunit.sourceforge.net/

但是正如名字所取的一样,他不是一个完整的产品,只是给测试使用的用来模拟浏览器的行为。

给一个例子:

import java.io.IOException;
import java.util.List;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.HtmlDivision;
import com.gargoylesoftware.htmlunit.html.HtmlListItem;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlUnorderedList;

public class Test {

    private static WebClient webClient;

    public static void main(String[] args) throws IOException {
      //webClient = new WebClient(BrowserVersion.CHROME, "proxy.com", 80);
        webClient = new WebClient(BrowserVersion.CHROME);
        HtmlPage page = webClient.getPage(""http://www.XXX.com/path/to/page.htm"");
        
        HtmlDivision div1 = page.getHtmlElementById("ksorder");
        List<HtmlDivision> divs = div1.getByXPath("//div[@class='sourceshow']");
        assert(divs.size() == 1);
        HtmlDivision div2 = divs.get(0);
        
        Iterable<DomElement> uls = div2.getChildElements();
        for (DomElement eul : uls) {
            HtmlUnorderedList ul = (HtmlUnorderedList)eul;
            Iterable<DomElement> lis = ul.getChildElements();
            for (DomElement eli : lis) {
                HtmlListItem li = (HtmlListItem)eli;
                System.out.printf("data=[%s], class=[%s]\n", li.getAttribute("data-id"), li.getAttribute("class"));
            }
        }
    }
}

对于HTML页面内容的分析框架和jsoup差不多,具体参考文档即可。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,958评论 1 45
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,870评论 1 92
  • 一、Gecco是什么 Gecco是一款用java语言开发的轻量化的易用的网络爬虫,不同于Nutch这样的面向搜索引...
    4ea0af17fd67阅读 2,103评论 0 1
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,175评论 1 32
  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 3,581评论 1 11