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:數據科學家養成記 |