jsoup 是一款基于 Java 的HTML解析器,它提供了一套非常省力的API,不但能直接解析某个URL地址、HTML文本内容,而且还能通过类似于DOM、CSS或者jQuery的方法来操作数据,所以 jsoup 也可以被当做爬虫工具使用,从网站获取dom结构,从而解析下载数据。
Jsoup很多概念和js类似,可参照对比理解
org.jsoup jsoup 1.11.3
使用 Jsoup.connect(String url).get()方法获取(只支持 http 和 https 协议)
try { Document document = Jsoup.connect("http://www.baidu.com").get(); System.out.println(document.title()); } catch (IOException e) { throw new RuntimeException(e); }
try { Document document = Jsoup.connect("http://www.baidu.com") .data("query", "Java") .userAgent("Mozilla") .cookie("auth", "token") .timeout(8000) .post(); System.out.println(document); } catch (IOException e) { throw new RuntimeException(e); }
可以使用静态的Jsoup.parse(File in, String charsetName) 方法从文件中加载文档。其中in表示路径,charsetName表示编码方式,示例代码:
File input = new File("/tmp/input.html"); Document doc = Jsoup.parse(input, "UTF-8"); System.out.println(doc);
使用静态的Jsoup.parse(String html) 方法可以从字符串文本中获得文档对象 Document ,示例代码:
String html = "First parse " + "Parsed HTML into a doc.
"; Document doc = Jsoup.parse(html); System.out.println(doc);
使用Jsoup.parseBodyFragment(String html)方法
String html = "Lorem ipsum.
"; Document doc = Jsoup.parseBodyFragment(html); // doc 此时为:Lorem ipsum.
Element body = doc.body(); System.out.println(body);
parseBodyFragment 方法创建一个新的文档,并插入解析过的HTML到body元素中。假如你使用正常的 Jsoup.parse(String html) 方法,通常也能得到相同的结果,但是明确将用户输入作为 body 片段处理是个更好的方式。
Document.body() 方法能够取得文档body元素的所有子元素,与 doc.getElementsByTag(“body”)相同。
我们可以利用dom结构的方式,通过标签,id,class等查找到下属元素
// 获取csdn首页所有的链接 Document doc = Jsoup.connect("http://www.baidu.com").get(); Elements elements = doc.getElementsByTag("body"); Elements contents = elements.first().getElementsByTag("a"); for (Element content : contents) { String linkHref = content.attr("href"); String linkText = content.text(); System.out.print(linkText + "\t"); System.out.println(linkHref); }
也可以使用类似于CSS选择器的语法来查找和操作元素,常用的方法为select(String selector)。
Document doc = Jsoup.connect("http://csdn.com").get(); // 获取带有 href 属性的 a 元素 Elements elements = doc.select("a[href]"); for (Element content : elements) { String linkHref = content.attr("href"); String linkText = content.text(); System.out.print(linkText + "\t"); System.out.println(linkHref); }
select()方法在Document、Element或Elements对象中都可以使用,而且是上下文相关的,因此可实现指定元素的过滤,或者采用链式访问。
select() 方法将返回一个Elements集合,并提供一组方法来抽取和处理结果。
例如:Elements elements = doc.select(“div.css_tr_event”);
衣服
)、
等)在解析了一个Document对象之后,你可能想修改其中的某些属性值,并把它输出到前台页面或保存到其他地方,jsoup对此提供了一套非常简便的接口(支持链式写法)。
当以下方法针对Element对象操作时,只有一个元素会受到影响。当针对Elements对象进行操作时,可能会影响到多个元素。
Document doc = Jsoup.connect("http://csdn.com").get(); // 复数,Elements Elements elements = doc.getElementsByClass("text"); // 单数,Element Element element = elements.first(); // 复数对象,所有 的元素都将受到影响 elements.attr("name","goods"); // 单数对象,只有一个元素会受到影响(链式写法) element.attr("name","shop") .addClass("red");
可以使用Element中的HTML设置方法具体如下:
Document doc = Jsoup.connect("http://csdn.com").get(); Element div = doc.select("div").first(); div.html("csdn
"); div.prepend("a
"); div.append("good
"); // 输出:a
csdn
good
Element span = doc.select("span").first(); span.wrap("
对于传入的文本,如果含有像 <, > 等这样的字符,将以文本处理,而非HTML。
// Element div = doc.select("div").first(); div.text(" one "); div.prepend(" two "); div.append(" three "); // 输出: two one three
问题描述:
你有一个包含相对URLs路径的HTML文档,现在需要将这些相对路径转换成绝对路径的URLs。
解决方式:
确保在你解析文档时有指定base URI路径。
然后使用 abs: 属性前缀来取得包含base URI的绝对路径。代码如下:
Document doc = Jsoup.connect("http://www.open-open.com").get(); Element link = doc.select("a").first(); // 输出:/ String relHref = link.attr("href"); // 输出:http://www.open-open.com/ String absHref = link.attr("abs:href");
说明:
在HTML元素中,URLs经常写成相对于文档位置的相对路径,如:…。当你使用 .attr(String key) 方法来取得a元素的href属性时,它将直接返回在HTML源码中指定的值。
假如你需要取得一个绝对路径,需要在属性名前加 abs: 前缀,这样就可以返回包含根路径的URL地址attr(“abs:href”)。因此在解析HTML文档时,定义base URI非常重要。
当访问某个网页需要使用代理服务器时,可以通过这种方法进行代理设置。后续元素操作就一样了;
Document document = Jsoup.connect("http://csdn.net/") .proxy("12.12.12.12", 1080) // 使用代理 .get();