首页 > 其他分享 >document.evaluate的详细用法(Xpath获取节点)

document.evaluate的详细用法(Xpath获取节点)

时间:2023-06-09 10:35:37浏览次数:42  
标签:Xpath XPath null evaluate 元素 document 页面


document.evaluate的详细用法

2006-12-28 18:03


使用 Greasemonkey 时会遇到的功能最为强大的一个工具就是 evaluate 函数。通过使用XPath这种查询语言,它可以用来寻找页面中的元素,属性和文本。 

举个例子来说,如果您想获得某个页面上的全部链接。您也许会想到使用document.getElementsByTagName('a');但是如果您还要继续检查是否每个链接都具有href属性,因为<a>还可以用来作为锚名称使用,这时,您需要使用Firefox内建的XPath支持去获取全部具有href属性的<a>元素。 

 例子: 获取页面上的全部链接 

var allLinks, thisLink;
allLinks = document.evaluate(
    '//a[@href]',
    document,
    null,
    XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
    null);
for (var i = 0; i < allLinks.snapshotLength; i++) {
    thisLink = allLinks.snapshotItem(i);
    // do something with thisLink
}

这里,document.evaluate 是关键的部分。 它把 XPath 查询语句作为一个字符串,其它的参数稍后再做解释。 这条 XPath 查询语句可以找到全部具有href属性的<a>元素,并将它们按照随机的顺序依次返回。(这就是说,第一个被返回的元素并一定也是页面上的第一个这样的元素。) 随后,您就可以用 allLinks.snapshotItem(i) 函数访问每一个元素。 

XPath表达式所能做到的甚至会使您惊讶。请看下面这个例子,它获取了全部具有title属性的元素。 

 

 例子: 获取全部具有title属性的元素 

var allElements, thisElement;
allElements = document.evaluate(
    '//*[@title]',
    document,
    null,
    XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
    null);
for (var i = 0; i < allElements.snapshotLength; i++) {
    thisElement = allElements.snapshotItem(i);
    switch (thisElement.nodeName.toUpperCase()) {
        case 'A':
            // this is a link, do something
            break;
        case 'IMG':
            // this is an image, do something else
            break;
        default:
            // do something with other kinds of HTML elements
    }
}

 

 如果您已经引用了某个元素(例如上面的 thisElement),您就可以用 thisElement.nodeName 来替代它所对应的在 HTML 页面中的标签名称。如果被访问的这个页面是以 text/html 的方式被服务器执行, 那么标签名称总是用大写子母返回,不论它在原始页面是如何定义的。 如果页面是 application/xhtml+xml 方式的, 那么标签名称就会以小写子母返回。 不论哪种情况,我总是用 thisElement.nodeName.toUpperCase() 得到大写的标签名称。  

这是另外一个 XPath 查询,它返回了 div 中的一个特殊的类。 

 例子: 获取 div 中的 sponsoredlink 类 

var allDivs, thisDiv;
allDivs = document.evaluate(
    "//div[@class='sponsoredlink']",
    document,
    null,
    XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
    null);
for (var i = 0; i < allDivs.snapshotLength; i++) {
    thisDiv = allDivs.snapshotItem(i);
    // do something with thisDiv
}

注意我在 XPath 查询语句外使用了双引号,这样在语句内部就可以使用单引号。 

在 document.evaluate 函数中有很多参数。第二个参数 (在前两个例子中都是docoment) 可以是一个元素, XPath 查询只返回包含在这个元素内的元素。所以,如果您已经引用了一个元素(比如, 通过 document.getElementById 或者 通过 document.getElementsByTagName 得到的数组中的一个元素), 那么您就可以限制查询只返回这个元素的子元素。 

第三个参数是对一个叫做 namespace resolver 函数的引用, 它只有在工作在 application/xhtml+xml 类型的页面上的用户脚本中是有效的。即使您对它不是很了解也没有关系,因为那种类型的页面不是很多,您可能一次也遇不到。 如果您很想知道它是如何使用的,请参考 Mozilla XPath documentation (http://www-jcsu.jesus.cam.ac.uk/~jg307/mozilla/xpath-tutorial.html),那里解释了它的用法。 

第四个参数是结果的返回方式。在前面的两个例子中都使用了 XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, 它将结果以随机的方式返回。我使用的几乎全部都是这种方式,但是,出于某种原因,您想让结果以它们在页面上出现的顺序返回,您可以使用 XPathResult.ORDERED_NODE_SNAPSHOT_TYPE 这种方式。Mozilla XPath documentation (http://www-jcsu.jesus.cam.ac.uk/~jg307/mozilla/xpath-tutorial.html)还给出了另外的一些用例。 

第五个参数用来合并两次 XPath 查询的结果。 在获得第一次调用 document.evaluate 得到的结果之后,它将两次查询的结果一起返回。在前面的两个例子中,这个参数都用了null,这意味着我们只想获得本次查询的结果。 

现在您明白了吗?XPath 既可以很简单,也可以很难,这取决于您要如何使用它。在此我强烈推荐您尽快去阅读 this excellent XPath tutorial (http://www.zvon.org/xxl/XPathTutorial/General/examples.html),从而了解更多的 XPath 语法。至于 document.evaluate 函数的其它参数, 我几乎从来不使用它们。事实上,您可以自己定义一个函数来封装它们。 

 例子: 自定义的 xpath 函数 

function xpath(query) {
    return document.evaluate(query, document, null,
        XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
}

在定义了这个函数之后,您就可以调用 xpath('//a[@href]') 来获得某个页面上的全部链接, 或者调用 xpath('//*[@title]') 来获得具有 title 属性的元素。您仍然需要通过 snapshotItem 函数来访问结果中的每一项,这个函数的类型并不是一个规则的Javascript数组。 


标签:Xpath,XPath,null,evaluate,元素,document,页面
From: https://blog.51cto.com/u_16065168/6445698

相关文章

  • XPath 简单语法
    XPath是XML的查询语言,和SQL的角色很类似。以下面XML为例,介绍XPath的语法。<?xmlversion="1.0"encoding="ISO-8859-1"?><catalog><cdcountry="USA"><title>EmpireBurlesque</title><artist>BobDylan</arti......
  • Elasticsearch专题精讲—— REST APIs —— Document APIs —— Reindex API
    RESTAPIs——DocumentAPIs——ReindexAPIhttps://www.elastic.co/guide/en/elasticsearch/reference/8.8/docs-reindex.html#docs-reindexCopiesdocumentsfromasourcetoadestination.将文档从源复制到目标。Thesourcecanbeanyexist......
  • Selenium+xpath爬取简书
    fromseleniumimportwebdriverimporttimefromlxmlimportetreeimportpymysqldriver=webdriver.Chrome()driver.get('https://www.jianshu.com/')#加载更多defload_mord(num):#通过观察发现,打开页面需要鼠标滑动大概5次左右才能出现阅读更多按钮for......
  • Elasticsearch专题精讲—— REST APIs —— Document APIs —— Update By Query API
    RESTAPIs——DocumentAPIs—— UpdateByQueryAPIhttps://www.elastic.co/guide/en/elasticsearch/reference/8.8/docs-update-by-query.html#docs-update-by-queryUpdatesdocumentsthatmatchthespecifiedquery.Ifnoqueryisspecified,performsanupdateo......
  • Elasticsearch专题精讲—— REST APIs —— Document APIs —— Update API
    RESTAPIs——DocumentAPIs——UpdateAPIhttps://www.elastic.co/guide/en/elasticsearch/reference/8.8/docs-update.htmlUpdatesadocumentusingthespecifiedscript.使用指定的脚本更新文档。1、Request(请求)https://www......
  • 04 Xpath_[实例]爬取maoyan
    目录Xpathlxml库的安装和使用提取的内容代码生成的csv下载的图片参考文档Xpathlxml库的安装和使用提取的内容随意选取的一段节点包含的影片信息,如下所示:<dd> <iclass="board-indexboard-index-1">1</i> <ahref="/films/1200486"title="我不是药神"class="image-link&quo......
  • python基础学习-XPath解析html
    参考地址:Python-Core-50-Courses/第33课:用Python解析HTML页面.mdatmaster·jackfrued/Python-Core-50-Courses(github.com) XPath是在XML(eXtensibleMarkupLanguage)文档中查找信息的一种语法,XML跟HTML类似也是一种用标签承载数据的标签语言,不同之处在于XML的标签......
  • SVG标签的Xpath定位方法(关闭Tab标签页)
    svg(可伸缩矢量图形 )在前端应用中广泛被使用,然而采用传统的xpath元素定位方法已经无法对其进行定位,我们需要将svg标签及其包含的子标签用以下方式表达:工作时遇到一个问题,就是想删除Tab标签页,但是标签的关闭是个SVG标签,用传统的Xpath标签无法定位,查找了一些资料,参考了两个别人分享......
  • Elasticsearch专题精讲—— REST APIs —— Document APIs —— Delete by query API
    RESTAPIs——DocumentAPIs——DeletebyqueryAPIhttps://www.elastic.co/guide/en/elasticsearch/reference/8.8/docs-delete-by-query.htmlDeletesdocumentsthatmatchthespecifiedquery.删除与指定查询匹配的文档。curl-XPOS......
  • Elasticsearch专题精讲—— REST APIs —— Document APIs —— Delete API
    RESTAPIs——DocumentAPIs——DeleteAPIRemovesaJSONdocumentfromthespecifiedindex.从指定的索引中移除JSON文档。1、Request(请求)https://www.elastic.co/guide/en/elasticsearch/reference/8.8/docs-delete.......