爬虫工具:浅谈HtmlCleaner+XPath解析HTML

现在常用的网页解析工具有:Jsoup,JsoupXpath,HtmlCleaner。

jsoup 是一款Java 的XML、HTML解析器,可直接解析某个URL地址、HTML文本内容和已经存在的文件。

JsoupXPath是基于Jsoup的拓展,使用路径的形式解析XML和HTML文档。核心类为JXDocument;JsoupXPath的节点对象JXNode不仅可以获取标签节点,还可以获取属性节点

HtmlCleaner是一个开源的Java语言的Html文档解析器。HtmlCleaner能够重新整理HTML文档的每个元素并生成结构良好(Well-Formed)的 HTML 文档。默认它遵循的规则是类似于大部份web浏览器为创文档对象模型所使用的规则。然而,用户可以提供自定义tag和规则组来进行过滤和匹配。它被设计的小,快速,灵活而且独立。HtmlCleaner也可用在Java代码中,当命令行工具或Ant任务。 解析后编程轻量级文档对象,能够很容易的被转换到DOM或者JDom标准文档,或者通过各种方式(压缩,打印)连续输出XML。

Jsoup解析:

第一步:创建Document

Jsoup创建Document的方式:

第一种:解析一个字符串获取Document对象


String html = "<div><a href='#'>jsoup测试</a></div>";
Document doc = Jsoup.parse(html);

第二种:解析一个html文档获取Document对象


String path = test.class.getResource("/html/example.html").getPath();
Document doc = Jsoup.parse(new File(path),"utf-8");

第三种:解析一个URL资源获取Document对象

Connection conn = Jsoup.connect("https://www.hao123.com");
Document doc = conn.get();

第二步:获得Element对象

第一种:通过标签属性获得Element对象

Element  getElementById (String  id )   

Elements  getElementsByTag (String tagName )                         通过标签获取一个元素集合对象  

Elements  getElementByClass( String className)                    通过元素类名获取一个元素集合对象

第二种:通过css选择器获得元素对象

Elements  select (String  cssQuery)                                                         通过css选择器获取Elements对象

Element  selectFirst(String  cssQuery)                                                    通过css选择获得第一个Element对象
 

第三步:从Element对象中解析最终结果

for (Element headline : newsHeadlines) {
    		                System.out.println("jsoup selector text=" + headline.html() + " : class=" + headline.attr("class") );  
    		                pqnr = headline.html();
    		                
    		                return_map.put(dataMxDm, pqnr);
    		            }

JsoupXPath解析

第一步:创建JXDocument对象

public  JXDocument (Document   doc)                                          使用Document对象来创建JXDocument对象

String path = test.class.getResource("/html/example.html").getPath();
Document doc = Jsoup.parse(new File(path),"utf-8");
JXDocument jxd = new JXDocument(doc);

第二步:获取JXNode对象

List<JXNode>  selN( String  xpath)                                                   找到路径返回所有满足的节点对象集合

类似Document的select()方法

JXNode  selNOne(String  xpath)                                                        找到路径返回的第一个满足的节点对象

类似Document的selectFirst()方法
 

第三步:解析JXNode对象

JXNode node = (JXNode) jxDocument.selNOne(xpath1);
        	//JXNode node = (JXNode) jxDocument.selOne(xpath2);
			System.out.println("8888"+node.getTextVal());
        	
        	List<Object> rs = jxDocument.sel(xpath1);
            for (Object o:rs){
                if (o instanceof Element){
                    int index = ((Element) o).siblingIndex();
                    System.out.println(index);
                }
                System.out.println("99999: "+o.toString());
            }

HtmlCleaner解析

第一步:首先我们要创建一个HtmlCleaner

HtmlCleaner htmlCleaner = new HtmlCleaner();

第二步:然后我们就可以用他来获取文件内容content。

TagNode tagNode= htmlCleaner.clean(content);

content可以是文件,也可以是hmtl字符串。

第三步:通过XPath路径解析获得Object[]对象:

Object[] tbodyNodeArray = tagNode.evaluateXPath(XPath);

这里XPath为你要读取的目录,可以是/body/table[2]/tbody/tr/td[2]/table[4]/tbody/tr/td/table/tbody  

这样,直接读取到table。

ReadFileUtil readFileUtil = new ReadFileUtil();
        	
        	html = readFileUtil.readFilePath(url);
			
            HtmlCleaner hc = new HtmlCleaner();
            TagNode tn = hc.clean(html);
            Object[] ns = tn.evaluateXPath(xpath);

            for(Object on : ns) {
                TagNode n = (TagNode) on;
                System.out.println("HtmlCleaner xpath text="+n.getText() + " : class=" + n.getAttributeByName("class") );  
                pqnr = n.getText().toString();
            }
           

如何获取Xpath路径以及CSS选择器路径:

打开目标网页,按F12.然后选中点中红框中的箭头,点击序号,及定位到序号在源文件的位置,然后右键,选择Copy,Copy Xpath 选取的就是XPath路径,Copy selector 选中的就是CSS选择器路径。

Demo下载:

https://download.csdn.net/download/u013310119/12274974

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章