R語言爬蟲系列2|XML&XPath表達式與R爬蟲應用

2021-02-13 機器學習實驗室

昨天跟微信上一不認識的同是搞數據技術的圈友聊天,我說最近在寫一個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文檔的架構。文檔以根元素<nbaplayer>開始,也以它結束。

 

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

 

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

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

<?xml version=」1.0」 encoding=」ISO-8859-1」?>

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

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

<nbaplayer>

   ...

<\nbaplayer>

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

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

<city name=」houston」> rockets </city>

它的組成部分有:

元素標題  city

起始標籤  <city>

終止標籤  </city>

數據值    <rockets>

 

關於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 <- xmlParse(file="D:/Rdata/nbadata.xml")

nbadata 

<?xml version="1.0" encoding="ISO-8859-1"?><nbaplayer>  <team>    <city name="houston"> rockets</city>    <player> james harden</player>  </team>  <team>    <city name="boston"> celtics</city>    <player> kyrie irving</player>  </team>  <team>    <city name="goldenstates"> worriors</city>    <player> stephen curry</player>  </team></nbaplayer>

簡單的一個函數就可以使得一個完整的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

往期精彩:

如何寫出整潔規範的R代碼?是時候討論一下代碼規範性了

R語言也能玩ps?magick包你值得擁有

【機器學習】決策樹總結|ID3 C4.5/C5.0 CHAID CART與QUEST

R語言向量化運算:apply函數族用法心得

Python面向對象編程:數據封裝、繼承和多態

[譯]為什麼R語言是當今最值得學習的數據科學語言

Python高級特性:切片、迭代、列表生成式、生成器與迭代器

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

相關焦點

  • Python 爬蟲必殺技:XPath
    小夥伴、大夥伴們,大家好~今天要給大家介紹的是Python 爬蟲必殺技:XPath。1. 簡介一提到網絡爬蟲,就不得不提到Xpath Helper,我們常常用它來對所要提取的文本內容進行定位,詳情可參考推文《Xpath Helper助Xpath爬蟲一臂之力》。除了這一利器外,了解Xpath定位的原理及其基本用法可以大幅提高我們的爬蟲技巧。
  • Xpath語法-網絡爬蟲基礎
    備註:此章節為基礎核心章節,未來會在網絡爬蟲的數據解析環節經常使用,學會Xpath解析語法,可為未來爬蟲解析省去很多麻煩。Xpath簡介XPath即為XML路徑語言,它是一種用來確定XML(標準通用標記語言的子集)文檔中某部分位置的語言。
  • R語言爬蟲系列6|動態數據抓取範例
    R雖然是以一門統計分析工具出現在大多數人印象中的,但其畢竟本質上是一門程式語言,對於爬蟲的支持雖不如Python那樣多快好省,但悉心研究一下總能做出一些讓你驚喜的效果。 大約很早之前,小編就寫過關於R語言爬蟲新貴rvest的抓取介紹,之前說rvest+SelectGadgetor是結構化網頁抓取的實戰利器,大家的溢美之詞不斷。
  • R語言網絡爬蟲經驗
    希望與大家分享學習經驗,推廣並加深R語言在業界的應用。在爬蟲的時候經常爬到一個時候就自己斷了,問題是我們還看不出來是斷了還是沒有斷,因此需要往裡面加入進度條,當進度條卡住的時候,就可以停止自己的程序在斷點重新跑 1 library(tcltk)   2u <- 1:2000   3 4 5 6pb <- tkProgressBar("進度","
  • Python爬蟲:單線程、多線程和協程的爬蟲性能對比
    = requests.get(main_url, headers=headers)r結果:<Response [200]>檢查一下所需數據的xpath:= requests.get(main_url, headers=headers)html = etree.HTML(r.text)all_movies = html.xpath("//div[@id='showing-soon']/div")result = []for e in all_movies:    imgurl, = e.xpath(".
  • python 爬蟲 | 解析庫之 XPath(1)
    所以接下來幾周的時間,我會把爬蟲各個基礎知識點全部在鞏固一遍。我的計劃是通過《python3 網絡爬蟲開發實戰》這本書,寫下自己的讀書筆記。並且在最後我會把今天文章所學到的內容,整理成一個思維導圖,方便大家理清知識點,也方便自己日後複習。話不多說,這周讓我們一起來學習下 python 爬蟲很重要的一個模塊「解析庫的使用」。
  • 解析XML文件
    爬蟲俱樂部將於2019年10月2日至10月5日在湖北武漢舉行Python編程技術培訓,本次培訓採用理論與案例相結合的方式,旨在幫助零基礎學員輕鬆入門Python,由淺入深學習和掌握Python編程技術,尤其是爬蟲技術和文本分析技術。
  • R語言爬蟲常用方法總結(以案例說明)
    Python傾向於做大型爬蟲,與R相比,語法相對複雜,因此Python爬蟲的學習曲線會相對陡峭。對於那些時間寶貴,又想從網上獲取數據的初學者而言,用R做爬蟲是最好的選擇,有三個原因:1、R語法相對直觀,規則更加靈活;2、對於數據量不大的用戶來數(小於百萬級),R也能夠非常自如地處理;3、先學習R爬蟲,等熟悉爬蟲的原理之後,在過渡到Python是很容易的。
  • R語言爬蟲手機app數據小筆記
    以前玩的爬蟲都是爬PC端網頁上的數據,比如以前的推文《網絡爬蟲+文本分析之解讀歷屆我們黨的全國代表大會報告》,《R語言網絡爬蟲+圖片分析之CNS
  • 如何用R做靜態網頁的爬蟲
    所以,廣義上來說,利用程式語言搭建類似於問卷星的平臺也是數據採集階段需要掌握的技能之一;除此之外,批量收集網絡中的現有數據也是一種技能。那麼今天,小羅為大家介紹一種批量收集網絡數據的方式---網絡爬蟲。什麼是爬蟲?
  • python爬蟲-知網(CNKI)主題文獻
    [2]/text()')[0]    ws.cell(row=num+1, column=7).value=ftext_r.xpath('//ul[@class="break"]/li[3]/text()')[0] if len(ftext_r.xpath('//ul[@class="break"]/li/text()'))==4:    ws.cell(row
  • 左手用R右手Python系列——模擬登陸教務系統
    在分享這篇文章之前,只想感慨一聲,雖然Python擁有更為完善的爬蟲生態和多如牛毛的爬蟲分享課程,但是貌似這些大部分內容,使用R語言中的RCurl+httr都可以做到,但是可惜的利用R語言學習爬蟲的愛好者與Pythoner相比,實在是太少了,R語言的高階爬蟲教程鳳毛麟角,只能一點一點兒在stackflow上面搜羅整理。希望我的這一篇案例能給大家帶來一點兒可借鑑的思路。
  • 講座資料速遞 | R語言爬蟲示例
    今天下午,陳堰平老師為我們帶來了包含技術含量的R語言爬蟲課。
  • Python爬蟲的名詞有什麼意義?
    在Scrapy爬蟲框架中,所有自定義的爬蟲都是從這個scrapy.spiders.name:言簡意賅,就是爬蟲的名字。2.allowed_domains:允許爬取的域名,不在此範圍的連結不會被跟進爬取。3.
  • 「爬蟲初步」十分鐘學會簡單實用XPath定位教程
    提取方法有很多,比如正則表達式、解析html等。XPath定位相較於正則表達式而言,具有學習成本低、對新手友好等特點。本文主要介紹Python3通過lxml模塊的簡單定位的教程,能夠解決爬蟲中大部分的數據獲取問題,適合新手學習。二、什麼是XPath?XPath 是一門在 XML 文檔中查找信息的語言。XPath 可用來在 XML 文檔中對元素和屬性進行遍歷。
  • Ptyhon網絡爬蟲第五篇
    Ptyhon網絡爬蟲(第五篇)——網頁解析正則表達式BeautifulSoupLxml正則表達式——對字符串操作的邏輯公式1:介紹用事先定義好的特定字符和這些特定的字符的組合組成一個規則字符串,用來表達對字符串的一種過濾邏輯。好比人工智慧中的謂詞邏輯:小明喜歡貓,小明也喜歡金魚,用小明去匹配到貓和金魚的有個過程。
  • Python爬蟲免費學習教程推薦
    因此,Python爬蟲不僅僅是編程開發者應該學習的技能,更是廣大職場人重要的加分項。那麼作為零基礎小白應該如何學習Python爬蟲呢?下面老師精選了一些Python爬蟲免費學習教程推薦給大家,趕緊來一起看看吧~
  • 網絡爬蟲(二)進階知識
    前面我們對爬蟲有了一點了解,以及對數據和網絡也有了一丟丟認識。當然對於爬蟲還有非常多的東西,我們就不再單獨進行講解了。當我們在用到的過程中,再挑出來講一講。一、程式語言爬蟲並不是一門語言的獨門秘籍,Python、Java、PHP、C#、Go等語言都可以講出精彩的故事。
  • requests-html:最簡單的爬蟲框架,看完你就會了
    很多朋友都聽說過Python的大名,而Python也擁有眾多的爬蟲框架,其中最簡單的莫過於requests-html了。它和著名的網絡請求庫requests是同一個作者,著重於XML數據提取,可以說是最簡單的爬蟲框架了。安裝requests-html安裝這個類庫非常簡單,直接通過pip就可以安裝了。
  • R語言編程入門進階(學會使用函數包)
    今天我們來學習R語言編程的進階——函數包的使用:掌握了一定R語言編程語法後,就要面對更高階的學習了,我在前面說過,編程最後看的不是你對程式語言的掌握程度,而是看的你的數學能力和邏輯能力。當然在實際的生物信息學或者生物學研究生的工作中,我們沒有那麼多時間來進行數學模型建立、編程。那麼巧妙應用已有的R語言函數包則是完成工作的捷徑。