6.3.2 Document对象详解
常用方法:
- Element getElementById(String id):根据id获取元素
- Elements getElementsByTag(String tagName):根据标签名获取元素
- Elements getElementsByAttribute(String key):根据属性获取元素
- Elements getElementsByAttributeValue(String key,String value):根据属性名=属性值获取元素。
- Elements select(Sting cssQuery):根据选择器选取元素。
<!ELEMENT students (student*) > <!ELEMENT student (name,age,sex)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT sex (#PCDATA)> <!ATTLIST student id ID #REQUIRED> <!ATTLIST name english>
<?xml version="1.0" ?> <!DOCTYPE students SYSTEM "student.dtd" > <!--引入dtd约束文件--> <students> <student id="user1"> <name english="zs">张三</name> <age>12</age> <sex>男</sex> </student> <student id="user2"> <name english="ls">李四</name> <age>14</age> <sex>女</sex> </student> </students>
package com.it.Jsoup; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.File; import java.io.IOException; /*Document对象使用*/ public class Jsoup3 { public static void main(String[] args) throws IOException { String path = Jsoup3.class.getClassLoader().getResource("com/it/XML/student.xml").getPath(); Document document = Jsoup.parse(new File(path), "UTF-8"); //1.根据id获取元素 Element user1 = document.getElementById("user1"); System.out.println(user1); System.out.println("--------------------------------"); //2.根据标签获取元素 Elements age = document.getElementsByTag("age"); for (Element element : age) { System.out.println(element); } System.out.println("--------------------------------"); //3.根据属性获取元素 Elements english = document.getElementsByAttribute("english"); for (Element element : english) { System.out.println(element); } System.out.println("--------------------------------"); //4.根据属性名=属性值获取元素 Elements elementsByAttributeValue = document.getElementsByAttributeValue("english", "ls"); for (Element element : elementsByAttributeValue) { System.out.println(element); } System.out.println("--------------------------------"); //5.使用css选择器获取元素 Elements select = document.select("#user2");//根据id获取元素 System.out.println(select); Elements sex = document.select("sex"); //根据标签获取元素 for (Element element : sex) { System.out.println(element); } } }
控制台输出
<student id="user1"> <name english="zs"> 张三 </name> <age> 12 </age> <sex> 男 </sex> </student> -------------------------------- <age> 12 </age> <age> 14 </age> -------------------------------- <name english="zs"> 张三 </name> <name english="ls"> 李四 </name> -------------------------------- <name english="ls"> 李四 </name> -------------------------------- <student id="user2"> <name english="ls"> 李四 </name> <age> 14 </age> <sex> 女 </sex> </student> <sex> 男 </sex> <sex> 女 </sex>
6.3.3 Element对象详解
Element: 元素对象
常用方法:
- String text():获取元素包含的纯文本。
- String html():获取元素包含的带标签的文本。
- String attr(String attributeKey):获取元素的属性值。
package com.it.Jsoup; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.File; import java.io.IOException; public class Jsoup4 { public static void main(String[] args) throws IOException { String path = Jsoup4.class.getClassLoader().getResource("com/it/XML/student.xml").getPath(); Document document = Jsoup.parse(new File(path), "UTF-8"); //1.根据css获取元素 Elements select = document.select("#user1"); Element element = select.get(0); //获取第一个元素 System.out.println("------------------------------------------------"); System.out.println(element.text()); //第一个元素的纯文本 System.out.println("------------------------------------------------"); System.out.println(element.html()); //第一个元素的html System.out.println("-----------------------------------------------"); System.out.println(element.attr("id")); //第一个元素的属性 } }
------------------------------------------------ 张三 12 男 ------------------------------------------------ <name english="zs"> 张三 </name> <age> 12 </age> <sex> 男 </sex> ----------------------------------------------- user1
6.4 Xpath解析
XPath即为XML路径语言,它是一种用来确定标记语言文档中某部分位置的语言。类似select选择器。
使用方法:
- 导入
Xpath
的jar包 - 获取
Document
对象 - 将
Document
对象转为JXDocument
对象 JXDocument
调用selN(String xpath)
,获取List<JXNode>
对象。- 遍历
List<JXNode>
,调用JXNode
的getElement()
,转为Element
对象。 - 处理
Element
对象。
package com.it.Jsoup; import cn.wanghaomiao.xpath.exception.XpathSyntaxErrorException; import cn.wanghaomiao.xpath.model.JXDocument; import cn.wanghaomiao.xpath.model.JXNode; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import java.io.File; import java.io.IOException; import java.util.List; public class Xpath { public static void main(String[] args) throws IOException, XpathSyntaxErrorException { //2.获取Document对象 String path = Xpath.class.getClassLoader().getResource("com/it/XML/student.xml").getPath(); Document document = Jsoup.parse(new File(path), "utf-8"); //3.将Document转为JXDocument对象 JXDocument jxDocument = new JXDocument(document); //4.JXDocument调用selN(String xpath),获取List<JXNode>对象。 List<JXNode> jxNodes = jxDocument.selN("//name");//获取所有name标签 List<JXNode> jxNodes1 = jxDocument.selN("//student[@id=user1]/age");//获取属性是id=user1的student标签的子元素age //5.遍历List<JXNode>,调用JXNode的getElement(),转为Element对象。 for (JXNode jxNode : jxNodes) { //6.处理Element对象. Element element = jxNode.getElement(); System.out.println(element); } System.out.println("--------------------------------"); for (JXNode jxNode : jxNodes1) { Element element = jxNode.getElement(); System.out.println(element); } } }
<name english="zs"> 张三 </name> <name english="ls"> 李四 </name> -------------------------------- <age> 12 </age>
七、XML案例 网络爬虫
网络爬虫(web crawler):自动抓取互联网信息的程序。
比如我们要开发一个网站,在网页的右上角需要显示今日天气,如果人工查询天气预报维护非常繁琐,我们就可以使用爬虫程序自动爬取天气网站的程序,自动更新。
Jsoup可以通过URL获取网页的HTML源文件,源文件中包含着网站数据,我们可以解析HTML源文件的数据来获取我们需要的信息。
爬虫步骤:
- 引入jar包。
- 使用Jsoup获取网页HTML源文件,转为Document对象
- 通过Document对象,获取需要的Element对象
- 获取Element对象的数据。
- 设置循环自动爬取
爬取知乎日报的数据
<?xml version="1.0"?> <Crawler> <min>9734020</min> <max>9734346</max> </Crawler>
package com.it.Jsoup; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements; import java.io.File; import java.io.IOException; import java.net.URL; public class Crawler { public static void getInfo(int i) throws IOException { //2.使用Jsoup获取网页HTML源文件,转为Document对象 Document document = Jsoup.parse(new URL("http://daily.zhihu.com/story/"+i), 3000); //3.通过Document对象,获取需要的Element对象 //根据属性获取图片 Elements pic = document.getElementsByAttributeValue("alt", "头图"); //获取文章标题 Elements title = document.select(".DailyHeader-title"); //获取文章作者 Elements author = document.select(".author"); //获取文章正文 Elements content = document.select(".content"); //4.获取Element对象的数据。 String src = pic.get(0).attr("src"); System.out.println(src); String text = title.get(0).text(); System.out.println(text); String au = author.get(0).text(); System.out.println(au); String con = content.get(0).text(); System.out.println(con); System.out.println("--------------------------------"); } public static void main(String[] args) throws IOException { //5.读取配置文件设置循环自动爬取 String path = Crawler.class.getClassLoader().getResource("com/it/Jsoup/Crawler.xml").getPath(); Document document = Jsoup.parse(new File(path), "utf-8"); Elements min = document.getElementsByTag("min"); Elements max = document.getElementsByTag("max"); for (int i = Integer.parseInt(min.get(0).text()); i <= Integer.parseInt(max.get(0).text());i++){ try { getInfo(i); } catch (Exception e) { System.out.println("爬取失败:"+e.getMessage()); } } } }