【Java】爬虫基础 -- XPath 小案例

XPath 是一门在 XML 文档中查找信息的语言。

基础信息


在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点,节点之间的关系有以下几种:
  • 父(Parent):每个元素以及属性都有一个父
  • 子(Children):元素节点可有零个、一个或多个子
  • 同胞(Sibling):拥有相同的父的节点
  • 先辈(Ancestor):某节点的父、父的父,等等。
  • 后代(Descendant):某个节点的子,子的子,等等

XPath语法:

XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径 (path) 或者步 (steps) 来选取的,以下面books.xml为例,描述xpath语法。

<?xml version="1.0" encoding="UTF-8"?>  
<bookstore>  
<book>  
  <title lang="eng">Harry Potter</title>  
  <price>29.99</price>  
</book>  
<book>  
  <title lang="eng">Learning XML</title>  
  <price>39.95</price>  
</book>  
</bookstore>  
  1. 选取节点:XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。 下面列出了最有用的路径表达式,右边两列列出了一些路径表达式以及表达式的结果
    在这里插入图片描述

  2. 谓语(Predicates):谓语用来查找某个特定的节点或者包含某个指定的值的节点,谓语被嵌在方括号中。


    在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:
    在这里插入图片描述

  3. 选取未知节点:XPath 通配符可用来选取未知的 XML 元素
    在这里插入图片描述

  4. 选取若干路径:通过在路径表达式中使用"|"运算符,可以选取若干个路径。在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果
    在这里插入图片描述

实例代码

  1. 新建一个python项目

  2. 在项目下新建books.xml 文件,作为等会处理的文件

    <?xml version="1.0" encoding="UTF-8"?>
    <bookstore>
        <book category="HTML">
            <title lang="en">Everyday Italian</title>
            <author>Giada De Laurentiis</author>
            <year>2005</year>
            <price>30.00</price>
        </book>
        <book category="PYTHON">
            <title lang="en">Harry Potter</title>
            <author>J K. Rowling</author>
            <year>2005</year>
            <price>29.99</price>
        </book>
        <book category="JAVA">
            <title lang="en">XQuery Kick Start</title>
            <author>James McGovern</author>
            <author>Per Bothner</author>
            <author>Kurt Cagle</author>
            <author>James Linn</author>
            <author>Vaidyanathan Nagarajan</author>
            <year>2003</year>
            <price>49.99</price>
        </book>
        <book category="WEB">
            <title lang="en">Learning XML</title>
            <author>Erik T. Ray</author>
            <year>2003</year>
            <price>39.95</price>
        </book>
    </bookstore>
    
  3. 在项目下新建一个xpath.html 文件,编写代码解析books.xml。
    代码如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script>
            /*定义一个函数用来加载xml文档*/
            function loadXMLDoc(dname) {
           
           
                if (window.XMLHttpRequest) {
           
           
                    xhttp = new XMLHttpRequest();//获取XMLHttpRequest对象
                } else {
           
           
                    xhttp = new ActiveXObject("Microsoft.XMLHTTP");
                }
                xhttp.open("GET",dname,false);
                xhttp.send("");
                return xhttp.responseXML;
            }
    
            xml = loadXMLDoc("books.xml");
    
    
            /*
                信息的位置
                path = "/bookstore/book/title"//选取所有title还可以这样写:path="//title[@lang='en']"
                path="/bookstore/book[1]/title" //选取第一个 book 的 title
                path ="/bookstore/book/price/text()" //选取所有价格
                path = "/bookstore/book[price>35]/price"  //选取价格高于 35 的 price 节点
                path = "//author"  //选取作者
                path = "//year"  //选取年份
            */
            path = "//price";
    
            if(window.ActiveXObject){
           
           
                /*xmlDoc.selectNodes(xpath);从XML文档中选取节点*/
                var nodes = xml.selectNodes(path);
    
                for (i = 0; i<nodes.length;i++){
           
           
                    document.write(nodes[i].childNodes[0].nodeValue);
                    document.write("<br>");
                }
            } else if (document.implementation && document.implementation.createDocument) {
           
           
                /*Firefox、Chrome、Opera 以及 Safari 使用 evaluate() 方法从 XML 文档中选取节点:*/
                var nodes = xml.evaluate(path, xml, null, XPathResult.ANY_TYPE, null);
                var result = nodes.iterateNext();
                while (result) {
           
           
                    document.write(result.childNodes[0].nodeValue);
                    //document.write(result.nodeValue);  //选取所有价格对应的处理
                    document.write("<br>");
                    result = nodes.iterateNext();
                }
            }
        </script>
    </head>
    <body>
    
    </body>
    </html>
    

代码分析:

  • 现代浏览器都支持使用 XMLHttpRequest 来加载 XML 文档的方法。针对大多数现代浏览器的代码:

    var xmlhttp=new XMLHttpRequest()  
    

    针对古老的微软浏览器(IE 5 和 6)的代码:

    var xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")  
    

  • 选取节点
    Internet Explorer 和其他处理 XPath 的方式不同。Internet Explorer 使用 selectNodes() 方法从 XML 文档中的选取节点:

    xmlDoc.selectNodes(xpath);  
    

    Firefox、Chrome、Opera 以及 Safari 使用 evaluate() 方法从 XML 文档中选取节点:

    xmlDoc.evaluate(xpath, xmlDoc, null, XPathResult.ANY_TYPE,null);  
    

  • loadXML() 用来加载xml文档

运行程序

将鼠标放到pycharm 界面的右上角,会出现:
在这里插入图片描述
选择你想要打开的浏览器,结果如下;
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45468845/article/details/108654328