
在這幅圖中,我們看到了一個html清單,列出了包的名稱,以及指向cran或github的url。要處理這樣的html,我們首先要對html源有所了解才能對分析方法做确定。讀者可以很容易地在chrome或firefox浏覽器中完成這個任務:右鍵點選目錄頂部的cran包标題,選擇inspect element指令,将看到如下輸出:
此時,我們已經得到了一個以ul(無序表)的html标簽列出的相關r包,在标簽h3後面就包括了cran packages字元串。
簡而言之:
我們需要解析這個html檔案
在search項找到第三級頭
從其後的未排序的html表中獲得所有表元素
這些工作也可以通過xml路徑語言來完成,該語言擁有一種特殊的文法能通過查詢來選擇在xml/html文檔中的節點。
xpath初看起來很難了解,也很複雜。例如,待處理的表可以被如下語句描述:
讓我再對此細化一下:
(1)我們正在查找一個h3标簽,該标簽的text屬性為“cran packages”,我們需要在整個文本中查找有這些屬性的特殊節點。
(2)following-siblings表達式代表了被選中的h3标簽中所有同層子節點。
(3)過濾器僅查找ul的html标簽。
(4)由于結果有好幾個,我們僅通過index(1)挑選出第一個兄弟節點。
(5)然後從中挑選出所有li标簽(表單元素)。
在r中重複類似操作:
and we have the character vector of the related 118 r packages:
使用xpath可以非常友善地在html文檔中選擇和搜尋節點,xpathapply函數也提供了同樣的功能。r将xpath函數的大多數功能都封裝在了libxml中,以提供更高效和更友善的操作方法。不過我們也可以使用xpathsapply函數,該函數傳回結果更加簡化,它和xpath之間的差别就像lapply函數和sapply函數的差别一樣。是以我們也可以按以下方式來儲存unlist調用的結果:
細心的讀者一定注意到了傳回的結果清單是一個簡單的字元向量,而原始的hmtl表單還包括了指向之前那些包的url,那麼這些内容跑到哪去了呢?
确切來說發生這種現象是由xmlvalue函數的特點造成的,我們在樣例的xpathsapply調用時從原始文檔抽取節點資訊時沒有使用預設的null作為評價函數,是以函數僅簡單地從每個不包含子節點的葉子節點中抽取原始文本資料,并得到了上面的結果。那麼如果我們對包url裡面的内容更感興趣怎麼辦呢?
調用不帶任何指定fun的xpathsapply函數将傳回所有原始子節點資訊,這對我們并沒有直接的幫助,也沒必要對這些結果再應用一些正常表達式。函數xmlvalue的幫助頁面為我們提供了一些類似可以完成這些應用的函數,這裡我們會毫不猶豫地選擇xmlattrs:
請注意樣例中更新了path的資訊,我們在這裡選擇的是所有的标簽a而非其父标簽li,和前面xmlvalue函數的參數不同。在樣例中,xmlattrs的抽取參數是'href',是以函數會對所有包含标簽a的節點抽取屬性及屬性值。
有了這些基本函數,使用者就能夠從線上資源中擷取任意公開的資料,當然在實際中實作的過程最後有可能會變得相對複雜。
某些時候,我們也有可能很幸運地找到一些現成的xpath篩選代碼,那麼就可以直接使用自帶的r包,通過web服務和首頁下載下傳資料。