當前位置:
首頁 > 最新 > XML&XPath表達式與R爬蟲應用

XML&XPath表達式與R爬蟲應用

昨天跟微信上一不認識的同是搞數據技術的圈友聊天,我說最近在寫一個R語言爬蟲系列,想把Python爬蟲那一套用R實現看看,剛開始在講HTML和XML的內容。這位朋友是前端轉資料庫開發,說了一句HTML和XML這些知識還不簡單,能看得懂英文的都能看得懂HTML代碼,HTML連編程語言都不是,以現在搞互聯網技術年輕人的學習能力,一上午就可以搞定。

借著這位大兄弟的鼓舞,louwill的學習激情又被燃到很高,今天就來繼續更新R語言爬蟲系列的第二期內容。在上一期里,louwill給大家介紹了HTML的基本語法和如何在R中用XML包對HTML進行解析。今天繼續跟大家介紹一下一個跟HTML很像的內容——XML。

在此之前,louwill和廣大吃瓜群眾一樣,看到XML和JSON這樣的字眼就一臉懵逼,一直心想這都是些什麼鬼,好好的excel數據不好嗎。年輕人就是naive,總喜歡對自己不懂的東西指手畫腳哈哈。好了,扯淡完畢,回歸正題,下面就鄭重地跟大家介紹XML以及與之相關的查詢語言XPath表達式。

XML

吃瓜群眾看標題點進來心裡一定是這麼想的:什麼是XML?它有什麼用?XML和HTML都什麼區別和聯繫嗎?我又該怎樣使用XML?

XML(eXtensible Markup Language)全稱叫做可擴展標記語言,首先它和HTML一樣,是一門標記語言,那它就該有標記語言的全部特徵,這是XML的共性。XML當然必須也有自己的特性,XML是被設計用來傳輸和存儲數據的,這和HTML用來顯示數據大不一樣,所以XML又有網路數據交換最流行格式的美譽。先看一段XML代碼:

上面的XML代碼提供了三名NBA球員的一些基本信息,大家可以仔細閱讀一下這個簡短的代碼,相信任何懂一點英文的朋友都可以毫無困難的讀懂其中包含的數據。正如之前所提到的,XML首先是一門標記語言,它的語法特性和HTML別無二致,XML里的值和名字都被包裹在有含義的標籤里,這三名球員都帶有主隊、姓名和所在城市信息,這種縮進的框架結構能夠讓我們輕易地看懂XML文檔的架構。文檔以根元素開始,也以它結束。

所以綜上我們就了解了,XML是一種類似於HTML的標記語言,它的設計宗旨是傳輸數據,而非顯示數據,在編寫XML文檔時,我們需要自行定義標籤。作為一種純文本格式,任何有處理純文本能力的軟體都可以拿來處理XML。

下面再簡單介紹一下XML的語法規則,XML的語法其實和HTML很像,我們就以上面那個XML代碼例子來說明:

1.一個XML文檔永遠以聲明該文檔的一行代碼來開頭:

version=」1.0」用來聲明該XML文檔的版本號,目前就兩個版本:1.0和1.1。encoding=」ISO-8859-1」表明聲明編碼格式。一提到編碼,相信有著各種亂碼經驗的R使用者都應該有體會。

2. XML文檔必須要有一個根元素,這個根元素包裹了整個文檔,在上面的例子里,根元素是:

...

XML是用來傳輸數據的,而這個數據通常是放在具體的XML元素中的。

3. 一個XML元素由起始標籤和具體內容來定義,一個元素可以用一個閉合標籤來結束,也可以在起始標籤里用一個斜杠(/)來閉合。元素里可以包含其他元素、屬性、具體數據等其他內容。我們來看上述例子中元素:

rockets

它的組成部分有:

元素標題 city

起始標籤

終止標籤

數據值

關於XML還有其他的一些像注釋、特殊字元命名、事件驅動等細節知識louwill在這裡就不再細說了,感興趣的朋友可以參考XML官方網站https://www.xml.com/。

如何在R語言中解析XML

在R語言中解析XML和解析HTML 是一樣的道理,就是對XML原件產生一個能保留住原始文檔結構的表徵,然後據此從這些文件中提取想要的信息。在R語言中解析XML的過程實際上包括兩個步驟,首先XML文件的符號序列會被讀取並從元素中創建層次化的C語言樹形數據結構,然後這個數據結構會通過使用處理器翻譯為R語言的數據結構。

R中導入和解析XML文檔的包就叫XML包,我們可以使用xmlParse( )函數來解析XML。和htmlParse( )函數較為類似,且看例子:

library(XML)

nbadata

nbadata

rockets

james harden celtics

kyrie irving worriors

stephen curry

簡單的一個函數就可以使得一個完整的XML文檔被解析到R裡面去了。至於如何提取HTML和XML中我們想要的數據信息,方式有多種,但最方便快捷的那還是XPath表達式。

XPath表達式

所謂XPath表達式,並不是什麼的高大上的東西,就是一種可以查詢標記語言的方法,你可以把它理解為SQL一樣的東西,louwill認為它比正則表達式要容易多了。簡單來說,XPath表達式就是選取XML或者HTML文件中節點的方法,這裡的節點,通常是指XML/HTML文檔中的元素。

XPath通過路徑表達式(Path Expression)來選擇節點信息,跟文件系統路徑一樣使用「/」符號來分割路徑。先來看看XPath表達式選擇節點的基本規則:

nodename:選擇該節點的所有子節點

「/」:選擇根節點

「//」:選擇任意節點

「@」:選擇屬性

還是以前面的XML文檔作為例子:

nbaplayer:選取nbaplayer元素所有的子節點

/nbaplayer:選取跟節點nbaplayer

//team:選擇所有的team子元素

//@name:選擇所有的name屬性值

除此之外,我們還可以通過給表達式附加一些條件來選擇指定的數據,所有的篩選條件都可以附在一個[ ]符號中:

/nbaplayer/team[1]:選擇nbaplayer下第一個team子元素

//city[@name]:選擇帶有name屬性的team節點

基本的XPath表達式的語法內容就這麼多啦,還有一些諸如通配符、多路徑選擇之類的大家可以自己去查找,這裡就不繼續展開了。熟練掌握XPath表達式是提高爬蟲代碼效率的重要因素,大家不妨對此重點學習一下。

SelectorGadget自動生成XPath表達式

另外,在最後louwill還想向大家推薦一款Chrome 插件:SelectorGadget。這是一款可以快速定位節點信息的CSS選擇器插件,可以方便快捷的為大家生成網頁中想要提取的信息的XPath表示,大家可以直接複製拿來放到R爬蟲代碼中去。下面就簡單介紹一下這款神器的使用方法。

打開任意一款搜索引擎輸入SelectorGadget,選擇搜索結果中像下面這樣的鏈接:

然後把點開的網頁拉到底部,將帶有下劃線的藍色字樣的SelectorGadget拖拽到你的瀏覽器收藏夾:

這樣SelectorGadget選擇器就安裝完畢啦!

下次想要使用SelectorGadget來生成XPath表達式的時候,我們就可以在收藏夾點擊一下它即可完成啟動。以NBA官網為例說明一下:

如上圖紅色箭頭所示,在右下角選擇XPath表達式後,網頁會自動跳出一個框框,裡面的代碼就是XPath表達式啦!把它複製你的代碼函數里就可以了!

參考資料:

Automated Data Collection with R

一個數據科學狂熱者的學習歷程

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 數據科學家養成記 的精彩文章:

ID3 C4.5/C5.0 CHAID CART與QUEST

TAG:數據科學家養成記 |