HTML和XML数据的分析与解析

HTML和XML数据的分析与解析

2023年6月29日发(作者:)

HTML和XML数据的分析与解析引⾔⽬前在 Java 中,解析 HTML ⼯具主要包含以下⼏种:1. jsoup:强⼤的 HTML 解析⼯具,⽀持以 jQuery 中 CSS Selector 的⽅式提取 HTML 中的元素,学习成本较低。2. HtmlCleaner:另外⼀款开源的 Java 语⾔的 HTML ⽂档解析器,⽀持以 XPath 的⽅式提取 HTML 中的元素。另外,在此说明,学习 XPath 语法对于使⽤另外⼀款基于 Selenium 的爬⾍⼯具特别有帮助。3. Htmlparser:对 HTML 进⾏有效信息搜索和提取的⼀款 Java ⼯具,但该⼯具已长时间不维护了(上次更新时间为2011年)。我在前⾯的篇章中,已介绍了 jsoup ⼯具解析 HTML 的内容,因此,在本⽂将主要介绍 HtmlCleaner 和 HtmlParser ⼯具对 HTML 的解析。针对 XML 数据,Java 也有很多⼯具进⾏解析,本⽂主要介绍 jsoup 解析 XML。HtmlCleaner 解析 HTMLHtmlCleaner 下载在 中搜索 HtmlCleaner。并使⽤ Eclipse 或其他⼯具构建 Maven ⼯程,使⽤ Maven ⼯程中的 下载 HtmlCleaner 相关依赖Jar 包。本篇以最新版 HtmlCleaner 配置为例: eaner htmlcleaner 2.22Xpath 语法XPath 是⼀门在 XML ⽂档中查找信息的语⾔,其可⽤来在 XML ⽂档中对元素和属性进⾏遍历。在 XPath 中,有七种类型的节点:元素、属性、⽂本、命名空间、处理指令、注释以及⽂档节点(或称为根节点)。其在 HTML 解析中,主要是对节点进⾏选取,⽽在选取的过程中,需要路径进⾏定位。浏览器脚本教程

浏览器脚本教程

从左侧的菜单选择你需要的教程!

JavaScript

JavaScript 是世界上最流⾏的脚本语⾔。

JavaScript 是属于 web 的语⾔,它适⽤于 PC、笔记本电脑、平板电脑和移动电话。

JavaScript 被设计为向 HTML 页⾯增加交互性。

许多 HTML 开发者都不是程序员,但是 JavaScript 却拥有⾮常简单的语法。⼏乎每个⼈都有能⼒将⼩的 JavaScript ⽚段添加到⽹页中。

如果您希望学习更多关于 JavaScript 的知识,请马上访问我们的

JavaScript 教程

HTML DOM

HTML DOM 定义了访问和操作 HTML ⽂档的标准⽅法。

DOM 以树结构表达 HTML ⽂档。

开始学习 HTML DOM

下表是 Xpath 的常⽤语法,案例对应上⾯的 HTML ⽂档。表达式nodename/描述选取此节点的所有⼦节点从根元素选取从匹配选择的当前节点选择⽂档中的节点,⽽不考虑它们的位置。选取当前节点选取当前节点的⽗节点选取属性选取属性实例body/html结果选取 body 元素的所有⼦节点。选取根元素 HTML。////div选取所有 div 元素,⽽不管它们在⽂档的位置。...@@./p../p//a[@href]//div [@id='course']选取当前节点下的 p 节点。选取当前节点的⽗节点下的 title。选取所有拥有名为 href 的属性的 a 元素。选取所有 id 属性为 course 的 div 节点。选取所有 id 属性为 w3school 的 div 节点下的h1 节点。选取属于 body ⼦元素的第⼀个 a 元素。选取属于 body ⼦元素的最后⼀个 a 元素。 //div[@id='w3school']/h1

//body/a[1]//body//a[last()]定位⼀个节点可以使⽤多种写法,例如上⾯的 HTML,选取所有 id 属性为 w3school 的 div 节点下的 h1 节点,可以使⽤以下⼏种Xpath 定位。//div[@id='w3school']//h1//div[@id='w3school']/h1//*[@id='w3school']/h1另外在浏览器中,可以在审查(元素)中,定位我们需要采集的数据,右键之后点击 copy -> copy xpath,获取相应的 Xpath 写法。解析 HTML使⽤ HtmlCleaner ⾸先要对其进⾏初始化,初始化之后,我们便可以使⽤ Xpath 语法操作节点。以下为 w3school 页⾯的解析案例。解析的内容如下:对应的程序为://这⾥笔者使⽤jsoup获取html⽂件Document doc = t("/").timeout(5000).get(); /String html =(); //转化成String格式//使⽤Htmlcleaner解析数据HtmlCleaner cleaner = new HtmlCleaner(); //初始化对象//n(html);TagNode node = (html); //解析HTML⽂件//通过Xpath定位标题的位置,这⾥使⽤//h1和/h1的结果是⼀样的Object[] ns = teXPath("//div[@id='w3school']//h1");

n("HTML中的标题是:t" + ((TagNode)ns[0]).getText());

Object[] ns1 = teXPath("//*[@id='w3school']/h1");

n("HTML中的标题是:t" + ((TagNode)ns1[0]).getText());

//遍历获取课程名以及课程地址Object[] ns2 = teXPath("//*[@id='course']/ul//a"); //这⾥使⽤//a表⽰不考虑位置,如果使⽤/a获取不到内容for(Object on : ns2) {

TagNode n = (TagNode) on;

n("课程名为:t" + t() + "t地址为:t" + ributeByName("href"));

}

//获取每个课程名称以及其对应的简介Object[] ns3 = teXPath("//*[@id='maincontent']//div");for (int i = 1; i < ; i++) { TagNode n = (TagNode) ns3[i];

//获取课程名称 String courseName = ementByName("h2", true).getText().toString(); //循环遍历所有的p节点获取课程简介 Object[] objarrtr = teXPath("//p"); String summary = ""; for(Object on : objarrtr) {

summary += ((TagNode) on).getText().toString(); }

n(courseName + "t" + summary);}在使⽤ evaluateXPath(String xPathExpression) 操作 TagNode 时得到的是 Object[] 数组,通过对该数组的操作便能够获取数据。另外,HtmlCleaner 还提供了很多种⽤法,例如上述程序中的 findElementByName()、getAttributeByName() 等操作⽅法,感兴趣的读者可以学习。利⽤上述程序解析得到的结果,如下图所⽰:HtmlParser 解析 HTMLHtmlParser 下载依旧采⽤ Maven ⼯程中的 下载 HtmlParser 相关依赖 Jar 包,配置如下: rser htmlparser 2.1⼯具使⽤介绍HTMLParser 的核⼼模块是 Parser 类,在实际的应⽤中也是通过该类分析 HTML ⽂件。该类中常⽤的构造⽅法总结如下:⽅法Parser()Parser(Lexer lexer)Parser(String resource)Parser(URLConnection connection)说明⽆参数构造。通过 Lexer 构造 Parser,在案例程序中我会使⽤到。给定⼀个 URL 或⽂件资源,构造 Parser。使⽤ URLConnection 构造 Parser。对⼤多数使⽤这来说,可以通过 URLConnection 或者通过其他⼯具获取的 HTML 字符串来初始化 Parser。HTMLParser 将解析过的信息保存为树结构,其中重要的是 Node 数据类型。Node 中包含的⽅法有对树结构操作的函数以及获取 Node 节点中包含内容的函数。⽅法NodeList getChildren()Node getParent ()Node getFirstChild ()Node getLastChild ()Node getPreviousSibling ()Node getNextSibling ()String getText ()String toPlainTextString()String toHtml ()Page getPage ()int getStartPosition ()int getEndPosition ()说明取得⼦节点的列表取得⽗节点取得第⼀个⼦节点取得最后⼀个⼦节点取得上⼀个兄弟节点取得下⼀个兄弟节点获取节点中的⽂本获取纯⽂本信息返回该节点对应的 HTML取得这个 Node 对应的 Page 对象取得这个 Node 在 HTML 页⾯中的起始位置取得这个 Node 在 HTML 页⾯中的结束位置同时在 HTMLParser 提供了 Filter 操作,即对结果进⾏过滤。常⽤的过滤器有:过滤器TagNameFilterHasChildFilterHasAttributeFilterStringFilterRegexFilterNodeClassFilter说明根据 Tag 的名字进⾏过滤。返回有符合条件的⼦节点的节点,需要另外⼀个 Filter 作为过滤⼦节点的参数。匹配出包含指定名称的属性,或者指定属性的节点。过滤显⽰字符串中包含指定内容的标签节点。正则表达式匹配节点。根据已定义的标签类获取节点。LinkStringFilter过滤器OrFilterAndFilter判断链接中是否包含某个特定的字符串,可以⽤来过滤出指向某个特定⽹站的链接。说明是结合⼏种过滤条件的“或”过滤器。结合⼏种过滤条件的“与”过滤器。使⽤案例//这⾥笔者使⽤Jsoup获取html⽂件Document doc = t("/").timeout(5000).get();

String html =(); //转化成String格式//使⽤Lexer构造Lexer lexer = new Lexer(html);Parser parser = new Parser(lexer);//过滤页⾯中的链接标签NodeFilter filter = new NodeClassFilter();//获取匹配到的节点NodeList list = tAllNodesThatMatch(filter);//遍历每⼀个节点for(int i=0; i<();i++){ Node node = (Node)tAt(i);

n("链接为:" + ((LinkTag) node).getLink() + "t标题为:" + nTextString() );}上述程序对应的输出结果如下图所⽰:我要讲解的第⼆个案例是基于 Filter 层层过滤的⽅式解析想要的数据。例如,w3school 页⾯中的:该案例程序使⽤ Parser(String resource) 构造,程序如下://⽣成⼀个解析器对象,⽤⽹页的 url 作为参数Parser parser = new Parser("/");//设置⽹页的编码(GBK)oding("gbk");//过滤页⾯中的标签NodeFilter filtertag= new TagNameFilter("ul");NodeFilter filterParent = new HasParentFilter(filtertag); //⽗节点包含ulNodeFilter filtername = new TagNameFilter("li"); //选择的节点为每个liNodeFilter filterId= new HasAttributeFilter("id"); //并且li节点中包含id属性NodeFilter filter = new AndFilter(filterParent,filtername); //并操作NodeFilter filterfinal = new AndFilter(filter,filterId); //并操作NodeList list = tAllNodesThatMatch(filterfinal); //选择匹配到的内容//循环遍历for(int i=0; i<();i++){ //获取li的第⼀个⼦节点 Node node = (Node)tAt(i).getFirstChild();

n( "链接为:" + ((LinkTag) node).getLink() +"t标题为:" + nTextString() );}程序的输出结果如下:我要讲解的第三个案例是基于 CSS 选择器来解析想要的数据。例如,w3school 页⾯中的:这个案例程序我将使⽤ Parser(URLConnection connection) 构造,具体程序如下://使⽤URLConnection请求数据URL url = new URL("/");URLConnection conn = nnection();Parser parser = new Parser(conn);//通过css选择器解析内容

CssSelectorNodeFilter Filter=new CssSelectorNodeFilter ("#course > ul > li");

NodeList list = tAllNodesThatMatch(Filter); //选择匹配到的内容//循环遍历for(int i=0; i<();i++){ //获取li的第⼀个⼦节点 Node node = (Node)tAt(i).getFirstChild();

n( "链接为:" + ((LinkTag) node).getLink() +"t标题为:" + nTextString() );}使⽤ CSS 选择器筛选是⼀种简单⼜快捷的⽅式,也是我个⼈最喜欢⽤的⼀种解析 HTML 的⽅式,这和 jsoup 有异曲同⼯之处。如要系统的学习 CSS 选择器的使⽤,读者可以参考:。jsoup 解析 XML为讲解 XML 数据的解析,我选取的案例是爬取⽹易汽车的销量数据,例如捷达汽车的销量,页⾯为:其部分 XML ⽂件如下: 利⽤ jsoup 选择器,可以快速的解析 XML ⽂件中的数据。解析捷达汽车的销售⽉份以及该⽉份的汽车销量,可采⽤如下程序://获取URL对应的HTML内容Document doc = t("/cxdata/xml/sales/model/").timeout(5000).get();//Jsoup选择器解析Elements sales_ele = ("sales");for (Element elem:sales_ele) { int salesnum=f(("salesnum")); String date = ("date"); n("⽉份:" + date + "t销量:" + salesnum);}程序解析数据的结果如下:总结本⽂主要讲解了 Java 中解析 HTML 的两种⼯具以及 jsoup 解析 XML ⽂件,读者可⾃⾏学习这⼏种⼯具的官⽅⽂档。在⽇常使⽤中,读者可根据⼯具的熟练程度进⾏选择。参考内容

发布者:admin,转转请注明出处:http://www.yc00.com/news/1687986168a63997.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信