精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用解釋器模式實(shí)現(xiàn)獲取元素 Xpath 路徑的算法

開發(fā) 前端 算法
對(duì)于一種語言,我們給出其文法表示形式(一種語言中的語法描述工具,用來定義語言的規(guī)則),并定義一種解釋器,通過這種解釋器來解釋語言中定義的句子。

[[432233]]

正文

1.解釋器模式

對(duì)于一種語言,我們給出其文法表示形式(一種語言中的語法描述工具,用來定義語言的規(guī)則),并定義一種解釋器,通過這種解釋器來解釋語言中定義的句子。

定義聽起來可能比較抽象,舉個(gè)例子比如我們常見的網(wǎng)站多語言,要實(shí)現(xiàn)多語言我們首先要預(yù)定語言的類型,提前設(shè)計(jì)不同語言的語料庫,然后我們會(huì)根據(jù)配置和統(tǒng)一的變量規(guī)則來映射到不同語言。

2.元素的Xpath路徑

XPath 用于在 XML 文檔中通過元素和屬性進(jìn)行導(dǎo)航。雖然XPath 是用來查找XML節(jié)點(diǎn),但同樣可以用來查找HTML文檔中的節(jié)點(diǎn),因?yàn)镠TML和XML結(jié)構(gòu)類似。這里我們只考慮html,即元素在html頁面中所處的路徑。

那么如何快速獲取元素的Xpath路徑呢?其實(shí)也很簡(jiǎn)單,我們打開谷歌調(diào)試工具:

選中Copy XPath即可復(fù)制元素的Xpath路徑。格式可能長這樣:

  1. //*[@id="juejin"]/div[2]/main/div/div[1]/article/div[1] 

獲取元素Xpath路徑的應(yīng)用場(chǎng)景很多,比如我們經(jīng)常使用的python爬蟲,利用爬蟲框架可以通過Xpath路徑很方便額控制頁面中的某個(gè)dom節(jié)點(diǎn),進(jìn)而獲取想要的數(shù)據(jù)和元素;又比如我們通過發(fā)送元素的Xpath路徑給后端,后端可以統(tǒng)計(jì)某一功能的使用情況和交互數(shù)據(jù);又比如分析用戶在網(wǎng)站中瀏覽的熱力分布圖,路徑畫像等等。

3.js實(shí)現(xiàn)獲取元素的Xpath路徑

在實(shí)現(xiàn)之前,首先我們分析一下Xpath路徑的結(jié)構(gòu),比如我們有一個(gè)頁面,元素span的結(jié)構(gòu)如下:

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3. <head> 
  4. <meta charset="UTF-8"
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0"
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge"
  7. <title>Document</title> 
  8. </head> 
  9. <body> 
  10. <div> 
  11. <span>我是徐小夕</span> 
  12. </div> 
  13. </body> 
  14. </html> 

 

 

 

 

那么我們的Xpath路徑可能長這樣:

  1. HTML/BODY|HEAD/DIV/SPAN 

從上面可以看出,我們的最右邊一個(gè)元素都是目標(biāo)元素,而最左邊第一個(gè)元素都是最外層容器。要完成這個(gè)過程首先我們要通過元素的parentNode來獲取當(dāng)前元素的父元素,直到找到最頂層位置。但我們還需要注意的一點(diǎn)是,每找到上一層我們還要遍歷該元素前面的兄弟元素previousSibling,如果這個(gè)兄弟元素名字和它后面的元素名字相同,則在元素名上+1.

第一步我們先實(shí)現(xiàn)一個(gè)遍歷同級(jí)兄弟元素的方法getSameLevelName:

  1. // 獲取兄弟元素名稱 
  2. function getSameLevelName(node){ 
  3.     // 如果存在兄弟元素 
  4.     if(node.previousSibling) { 
  5.         let name = '',   // 返回的兄弟元素名稱字符串 
  6.            count = 1,    // 緊鄰兄弟元素中相同名稱元素個(gè)數(shù) 
  7.            nodeName = node.nodeName, 
  8.            sibling = node.previousSibling; 
  9.         while(sibling){ 
  10.             if(sibling.nodeType == 1 && sibling.nodeType === node.nodeType && sibling.nodeName){ 
  11.                 if(nodeName == sibling.nodeName){ 
  12.                     name += ++count
  13.                 }else { 
  14.                     // 重制相同緊鄰節(jié)點(diǎn)名稱節(jié)點(diǎn)個(gè)數(shù) 
  15.                     count = 1; 
  16.                     // 追加新的節(jié)點(diǎn)名稱 
  17.                     name += '|' + sibling.nodeName.toUpperCase() 
  18.                 } 
  19.             } 
  20.             sibling = sibling.previousSibling; 
  21.         } 
  22.         return name 
  23.     }else { 
  24.         // 不存在兄弟元素返回'' 
  25.         return '' 
  26.     } 

第二步,遍歷文檔樹。

  1. // XPath解釋器 
  2. let Interpreter = (function(){ 
  3. return function(node, wrap){ 
  4. // 路徑數(shù)組 
  5. let path = [], 
  6. // 如果不存在容器節(jié)點(diǎn),默認(rèn)為document 
  7. wrap = wrap || document; 
  8. // 如果當(dāng)前節(jié)點(diǎn)等于容器節(jié)點(diǎn) 
  9. if(node === wrap) { 
  10. if(wrap.nodeType == 1) { 
  11. path.push(wrap.nodeName.toUpperCase()) 
  12. return path 
  13. // 如果當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)不等于容器節(jié)點(diǎn) 
  14. if(node.parentNode !== wrap){ 
  15. // 對(duì)當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)執(zhí)行遍歷操作 
  16. path = arguments.callee(node.parentNode, wrap) 
  17. // 如果當(dāng)前節(jié)點(diǎn)的父元素節(jié)點(diǎn)與容器節(jié)點(diǎn)相同 
  18. else { 
  19. wrap.nodeType == 1 && path.push(wrap.nodeName.toUpperCase()) 
  20. // 獲取元素的兄弟元素的名稱統(tǒng)計(jì) 
  21. let siblingsNames = getSameLevelName(node) 
  22. if(node.nodeType == 1){ 
  23. path.push(node.nodeName.toUpperCase() + sublingsNames) 
  24. // 返回最終的路徑數(shù)組結(jié)果 
  25. return path 
  26. })() 

有了這兩個(gè)方法,我們就可以輕松獲取元素的XPath路徑啦,比如:

  1. let path = Interpreter(document.querySelector('span')) 
  2. console.log(path.join('/')) 

 

這樣會(huì)返回開篇的一樣的數(shù)據(jù)結(jié)構(gòu)了.如:HTML/BODY|HEAD/DIV/SPAN

 

責(zé)任編輯:武曉燕 來源: 趣談前端
相關(guān)推薦

2022-10-13 08:08:40

解釋器模式算法

2024-06-05 09:41:41

2020-11-09 08:20:33

解釋器模式

2023-05-15 08:51:46

解釋器模式定義

2021-07-07 10:31:19

對(duì)象池模式解釋器模式設(shè)計(jì)模式

2010-04-21 08:38:18

解釋器模式PHP設(shè)計(jì)模式

2022-04-15 08:30:00

Lombok@Builde構(gòu)建器

2011-11-30 21:56:31

ibmdwXPathPHP

2016-09-12 14:05:27

PythonPython解釋器Web

2023-03-03 08:12:07

設(shè)計(jì)模式語言

2023-11-07 10:10:36

設(shè)計(jì)模式元素

2022-11-03 08:00:00

Xpath動(dòng)態(tài)元素定位器

2010-02-01 13:55:12

Python 解釋器

2022-09-14 08:16:48

裝飾器模式對(duì)象

2013-04-23 09:31:52

SQL Server

2014-11-11 15:46:54

MapReduce算法

2021-01-12 05:03:15

PythonLxmlXpath

2024-04-10 12:27:43

Python設(shè)計(jì)模式開發(fā)

2020-11-24 19:20:02

iOS夜間模式緩存

2022-01-05 08:58:08

Python解釋器編程語言
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

免费毛片在线看片免费丝瓜视频| 国产黄色特级片| 欧美日本高清视频| 日批视频在线看| 爱啪视频在线观看视频免费| 久久久久久免费毛片精品| 国产精品免费久久久| 欧美又粗又大又长| 首页亚洲中字| 宅男在线国产精品| 黄色一级片播放| 午夜免费视频在线国产| 久久成人麻豆午夜电影| 在线视频一区二区| 国产成人精品一区二区在线小狼| 亚洲日本天堂| 亚洲精品免费在线| 蜜桃视频在线观看成人| 国产成a人亚洲精v品无码| 国产日本精品| 九色精品免费永久在线| 欧美激情久久久久久久| 日本在线一区二区三区| 在线一区二区三区做爰视频网站| 国产香蕉一区二区三区| 青青久在线视频| 国产麻豆精品久久一二三| 亲子乱一区二区三区电影| 午夜免费激情视频| 欧美日中文字幕| 亚洲国产精品久久久| 182午夜视频| 久久久男人天堂| 一区二区三区日韩欧美精品 | 香蕉成人app| 欧美少妇一区二区| 无码人妻丰满熟妇区96| 欧美人动性xxxxz0oz| 亚洲同性gay激情无套| 欧美日本国产精品| 深夜福利视频在线免费观看| 国产精品99久久久久久久女警| 国产精品欧美日韩一区二区| 黄色一级视频免费看| 夜久久久久久| 亚州国产精品久久久| 午夜写真片福利电影网| 综合视频在线| 欧美精品在线免费观看| 日本一级片免费| 国产精品毛片一区二区在线看| 一本大道久久加勒比香蕉| 亚洲永久精品ww.7491进入| 久久夜色电影| 精品丝袜一区二区三区| 自拍视频一区二区| 天堂一区二区三区四区| 精品亚洲va在线va天堂资源站| 水蜜桃av无码| 亚洲香蕉视频| 国产亚洲精品久久久优势| 精品人妻无码一区二区三区| 国产欧美日韩影院| 有码中文亚洲精品| 一级性生活免费视频| 久久一区二区三区电影| 久色乳综合思思在线视频| 国产高潮国产高潮久久久91| 欧美.www| 91国内产香蕉| 少妇久久久久久久| 欧美96一区二区免费视频| 国产三级精品网站| 国产女同91疯狂高潮互磨| 国产一区二区三区av电影| 91丨九色丨国产在线| 亚洲爱爱综合网| 99久久99精品久久久久久| 奇米精品在线| 成人在线网址| 亚洲一区二区三区激情| 欧美三级一级片| 欧美日韩尤物久久| 这里是久久伊人| 欧美激情 亚洲| 最新国产精品视频| 日韩中文字幕在线播放| 久久久久成人网站| 日韩中文字幕麻豆| 亚洲一区二区三区毛片| 韩国中文字幕hd久久精品| 91蝌蚪porny| www亚洲国产| а√天堂中文在线资源8| 在线观看成人小视频| 日本美女久久久| 丝袜连裤袜欧美激情日韩| 最近2019年手机中文字幕| 久久久久黄色片| 日韩不卡一二三区| 岛国视频一区免费观看| jizz在线免费观看| 亚洲国产综合色| www午夜视频| 精品国产一区二区三区不卡蜜臂| 在线观看国产精品日韩av| 久久久久无码精品国产| 日本欧美在线观看| 国产一区喷水| 欧美日本高清| 色婷婷av一区二区三区大白胸| 永久免费黄色片| 精品国产精品国产偷麻豆| 欧美激情免费看| 91丨九色丨蝌蚪丨对白| 99久久综合99久久综合网站| 国产a级片免费看| 精品国产第一福利网站| 精品国产乱码久久久久久蜜臀| 亚洲天堂最新地址| 亚洲在线一区| 国产精品制服诱惑| www在线免费观看视频| 日本二三区不卡| 亚洲中文字幕一区| 欧美日韩国产在线一区| 成人黄色免费在线观看| 国产二区视频在线观看| 精品久久久久久久久久久久久| 老女人性生活视频| 天天精品视频| 国产剧情日韩欧美| 国产51人人成人人人人爽色哟哟| 婷婷亚洲久悠悠色悠在线播放| 久久综合桃花网| 久久久久亚洲| 国产日韩在线播放| 日本在线观看www| 欧美在线观看一区| 久久亚洲无码视频| 日韩专区中文字幕一区二区| 久久草.com| xxxcom在线观看| 亚洲第一av在线| 精品处破女学生| 国产成人精品免费视频网站| 无码日本精品xxxxxxxxx| 国产精品3区| 精品国内亚洲在观看18黄| 中文字幕有码视频| 国产精品人成在线观看免费 | 久久精品资源| 日韩中文字幕第一页| 91国偷自产中文字幕久久| 国产精品乱码一区二三区小蝌蚪| 波多结衣在线观看| 91欧美国产| 亚洲xxxxx| 午夜小视频福利在线观看| 欧美大胆人体bbbb| 国产第一页在线播放| av在线不卡电影| 黄色a级片免费| 精品美女久久| 91在线视频导航| 爱情岛亚洲播放路线| 亚洲精品wwwww| 免费黄色av片| 国产精品高潮久久久久无| 搡的我好爽在线观看免费视频| 欧美黄免费看| 国内不卡一区二区三区| 久久青青视频| 视频在线一区二区| 亚洲av色香蕉一区二区三区| 激情av一区二区| 在线观看免费小视频| 精品亚洲porn| 日本人体一区二区| 精品免费在线| 99热最新在线| 三上悠亚一区二区| 啊v视频在线一区二区三区| www.亚洲天堂.com| 日韩欧美在线第一页| 手机在线中文字幕| 成人av电影免费在线播放| 老头吃奶性行交视频| 一区二区三区四区在线观看国产日韩| 国产精品传媒毛片三区| 精品123区| 欧美激情网友自拍| 成人在线观看一区| 精品sm在线观看| 中文字幕免费播放| 亚洲国产成人tv| 呻吟揉丰满对白91乃国产区| 成人性生交大片| 免费黄色福利视频| 色综合天天爱| 精品一区二区国产| 免费精品一区二区三区在线观看| 97超碰国产精品女人人人爽| 蜜芽在线免费观看| 亚洲欧美一区二区三区情侣bbw| 国产欧美日韩综合精品一区二区三区| 欧美日韩午夜剧场| 好吊色视频在线观看| 欧美国产一区二区| 欧美77777| 国产精品沙发午睡系列990531| 丰满饥渴老女人hd| 日韩成人午夜电影| 成人精品视频在线播放| 日韩大片在线播放| 久久国产精品久久精品国产| 亚洲资源在线| 国产精品高清在线| 精品一性一色一乱农村| 亚洲色图日韩av| 高清乱码毛片入口| 555www色欧美视频| 中国女人一级一次看片| 精品国产91久久久久久老师| www.色小姐com| 中文字幕一区不卡| 永久免费毛片在线观看| 91蜜桃在线免费视频| 日本性生活一级片| 国产成人精品亚洲日本在线桃色| 激情五月俺来也| 天堂一区二区在线| 国产成人a亚洲精v品无码| 伊人狠狠色j香婷婷综合| 99热这里只有精品7| 爽成人777777婷婷| 亚洲一区二区三区午夜| 国产欧美日韩| 日韩精彩视频| av亚洲免费| 欧美在线3区| 国产影视一区| 日韩中文字幕av在线| 久久99国产精品视频| 青青草原成人| 欧美色图一区| 亚洲国产精品综合| 欧美韩日一区| 国风产精品一区二区| 永久91嫩草亚洲精品人人| 国产成人精品免费看在线播放| 91麻豆国产自产在线观看亚洲| 亚洲欧洲中文| 99久久夜色精品国产亚洲1000部| 一区二区在线观看网站| 国产精品久久久久久麻豆一区软件 | 久草手机在线观看| 岛国视频午夜一区免费在线观看| 国产精品久久久久久久久久久久久久久久久 | 亚洲人成啪啪网站| 98在线视频| www.xxxx精品| 欧美韩日亚洲| 欧美性视频精品| 香蕉成人影院| 91精品在线观| 国产精品115| 欧美一二三区| 97在线精品| av影院在线播放| 伊人精品成人久久综合软件| 午夜肉伦伦影院| 麻豆精品久久精品色综合| 麻豆网站免费观看| 91免费观看视频在线| 波多野结衣欲乱| 夜夜精品视频一区二区| 日本三级小视频| 在线观看日韩av先锋影音电影院| 91资源在线视频| 亚洲成av人片在线观看香蕉| 免费黄色片在线观看| 久久精品人人爽| aa视频在线观看| 国产精品一区二区三区毛片淫片| 精品伊人久久| 美女黄毛**国产精品啪啪| 欧美韩国日本在线观看| 国产原创中文在线观看| 美女诱惑一区二区| av电影在线播放| 中文字幕 久热精品 视频在线| 国产精品九九九九九九| 91久久精品日日躁夜夜躁欧美| 国产强伦人妻毛片| 亚洲欧美激情精品一区二区| а√天堂在线官网| 国产mv免费观看入口亚洲| 日韩中文在线| 天堂√在线观看一区二区| 狠狠综合久久| 亚洲欧美日韩精品一区| 99视频一区二区| 极品盗摄国产盗摄合集| 欧美午夜精品一区二区三区| 日本高清视频在线| 久久精品中文字幕一区| 国产精品粉嫩| 国产精品久久久一区二区三区| 欧美日韩亚洲在线观看| 欧美 国产 综合| 国产精品18久久久久久久久| 欧美激情 一区| 色综合色狠狠综合色| 亚洲精品综合久久| 久久精品最新地址| 日韩制服一区| 欧美日韩国产精品一卡| 韩日精品视频| 操人视频免费看| 国产精品欧美一级免费| 无码人妻久久一区二区三区| 精品av综合导航| 欧美xxxxhdvideosex| 91精品在线国产| 五月天久久777| 午夜激情av在线| 国产欧美精品国产国产专区| 日韩污视频在线观看| 欧美tickling网站挠脚心| av网站免费在线观看| 成人黄色av网| 久久99精品久久久久久三级 | 亚洲精品国产精品国| 久久久国产精品x99av| 欧美极品在线| 一区二区精品免费视频| 日本特黄久久久高潮| 影音先锋男人在线| 欧美亚日韩国产aⅴ精品中极品| 欧美男男激情freegay| 午夜精品久久久久久久男人的天堂 | 二区三区在线观看| 成人中文字幕+乱码+中文字幕| 久久视频精品| 欧美一级特黄aaa| 亚洲欧美偷拍三级| 国产日韩精品suv| 欧美成人精品一区| 日韩影片在线观看| 中文精品无码中文字幕无码专区 | 欧美日韩在线观看一区二区 | 亚洲视频在线一区二区| 国产美女免费视频| 欧美成人一二三| 91精品国产自产在线丝袜啪| 国产www免费| jlzzjlzz国产精品久久| 日本天堂网在线| 亚洲三级 欧美三级| 99久久er| 奇米777四色影视在线看| 成人一区在线观看| 天天综合网入口| 亚洲欧美精品中文字幕在线| 快播电影网址老女人久久| 亚洲一区二区三区涩| 国产精品亚洲第一区在线暖暖韩国| 少妇aaaaa| 亚洲黄色av女优在线观看| 欧美天堂视频| 波多野结衣三级在线| 成人黄色av电影| 丰满少妇xoxoxo视频| 日韩在线精品视频| 综合视频一区| 男女啪啪网站视频| 亚洲免费观看高清在线观看| 欧美一级特黄aaaaaa| 国产suv精品一区二区| 亚洲激情中文在线| 亚洲一级av无码毛片精品| 欧美自拍偷拍一区| 手机电影在线观看| 欧美日韩免费观看一区| 狠狠色狠狠色综合系列| 日本少妇性生活| 中文字幕九色91在线| 99国产精品久久一区二区三区| 国产aaa一级片| 亚洲免费观看高清完整版在线观看| 日韩在线观看视频一区二区三区| 国产精品成久久久久三级| 欧美激情1区| 欧美成人另类视频| 亚洲高清不卡av| 四虎精品一区二区免费| 俄罗斯av网站| 亚洲精品国产一区二区三区四区在线| 色视频在线观看|