1、jsoup简介 jsoup 是一款 Java的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。jsoup 的主要功能如下: (1)从一个 URL,文件或字符串中解析HTML; (2)使用DOM或CSS选择器来查找、取出数据; (3)可操作HTML元素、属性、文本; 2、maven配置 <!-- jsoup --> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.7.3</version> </dependency> 3、解析一个HTML文档 3.1 从字符串解析 String html = "<html><head><title>First parse</title></head>" + "<body><p>Parsed HTML into a doc.</p></body></html>"; <!-- 解析之后可以用Document的方法,拿出html中需要的数据 --> Document doc = Jsoup.parse(html); 3.2 从URL获取解析 Document doc = Jsoup.connect("http://example.com/").get(); String title = doc.title(); (1)说明 connect(String url)方法创建一个新的 Connection, 和get()取得和解析一个HTML文件。如果从该URL获取HTML时发生错误,便会抛出 IOException,应适当处理。Connection 接口还提供一个方法链来解决特殊请求,具体如下: Document doc = Jsoup.connect("http://www.oschina.net/") .data("query", "Java") // 请求参数 .userAgent("I ’ m jsoup") // 设置 User-Agent .cookie("auth", "token") // 设置 cookie .timeout(3000) // 设置连接超时时间 .post(); // 使用 POST 方法访问 URL 这个方法只支持Web URLs (http和https 协议); 假如你需要从一个文件加载,可以使用parse(File in, String charsetName) 代替。 3.3 从文件解析 File input = new File("/tmp/input.html"); Document doc = Jsoup.parse(input, "UTF-8", "http://www.oschina.net/"); (1)说明 parse的第三个参数,需要在这里指定一个网址(虽然可以不指定),因为HTML文档中会有很多例如链接、图片以及所引用的外部脚本、css 文件等,而第三个名为 baseURL 的参数的意思是当 HTML 文档使用相对路径方式引用外部文件时,jsoup 会自动为这些 URL 加上一个前缀,也是这个 baseURL。 例如 :<a href=/project> 开源软件 </a> 会被转换成 <a href=http://www.oschina.net/project> 开源软件 </a>。 4、遍历一个HTML文档 4.1 Document方式遍历元素 4.1.1 搜索元素方法 getElementById(String id) getElementByTag(String tag) getElementByClass(String className) getElementByAttribute(String key) siblingElements(), firstElementSibling(), lastElementSibling(), nextElementSibling(), previousElementSibling() parent(), children(), child(int index) 4.1.2 获取元素数据 attr(String key) – 获取key属性 attributes() – 获取属性 id(), className(), classNames() text() – 获取文本内容 html() – 获取元素内部HTML内容 outerHtml() – 获取包括此元素的HTML内容 data() – 获取<srcipt>或<style>标签中的内容 tag(), tagName() 4.2 选择器语法遍历元素(jsoup与其他解析器的区别是可以使用类似jquery的选择器语法来搜索及过滤出所需的元素)4.2.1 基本选择器 tagname: 搜索tag标签的元素 ns|tag: 搜索命名空间内tag标签的元素,如fb|name:<fb:name> id: 搜索有指定id的元素 .class: 搜索有指定class的元素 [attribute]: 搜索有attrribute属性的元素 [^attri]: 搜索有以attri开头的属性的元素 [attr=value]: 搜索有指定属性及其属性值的元素 [attr^=value], [attr$=value], [attr*=value]: 搜索有指定attr属性,且其属性值是以value开头、结尾或包括value的元素,如[href*=/path/] [attr~=regex]: 搜索有指定attr属性,且其属性值符合regex正则表达式的元素 *: 搜索所有元素 4.2.2 选择器组合 el#id: 同时指定标签名称和id el.class: 同时指定标签名称和class el[attr]: 同时指定标签名称和及其中所含属性的名称 上述3项的任意组合,如a[href].highlight ancestor child: 包含,如div.content p,即搜索<div class=”content”>下含有<p>标签的元素 ancestor > child: 直接包含,如div.content > p,即搜索直属<div class="content">节点下的<p>标签元素;div.content > *,即搜索<div class="content">下的所有元素 siblingA + siblingB: 直接遍历,如div.head + div,即搜索<div class="head"><div>的元素,其中不再包含子元素 siblingA ~ siblingX: 遍历,如h1 ~ p,即<h1>下直接或间接有<p>的元素 el, el, el: 组合多个选择器,搜索满足其中一个选择器的元素 5、使用范例 /* previousSibling()获取某标签前面的代码 nextSibling()获取某标签后的代码 如: <form id=form1> 第一名:Lily <br/> 第二名:Tom <br/> 第三名:Peter <br/> </form> */ Elements items = doc.select("form[id=form1]"); Elements prevs = items.select("br"); for(Element p : prevs){ String prevStr = p.previousSibling().toString().trim()); } /* 常用的链接抓取 */ String itemTag = "div[class=mydiv]"; String linkTag = "a" Elements items = doc.select(itemTag); Elements links = items.select(linkTag); for(Element l : links){ String href = l.attr("abs:href");//完整Href String absHref = l.attr("href");//相对路径 String text = l.text(); String title = l.attr("title"); }