xml_view_ptt_xpath

在寫爬蟲的過程中,常需要針對取得的 html 檢查內容,並用 XPath 或 CSS selector 擷取所需要的資料區塊。但在使用 IDE 撰寫腳本時,要做到這些事必須要把 html 的文本內容 print 出來,或是另存成 html file 再用瀏覽器檢視;若測試 XPath 時,因無法很清楚地直接在 console 瀏覽 xml 的樹狀結構,所以原本需搭配 Chrome 的 XPath Helper 會比較方便。

xmlview package 提供了一個在 RStudio 上互動檢視 XML 以及測試 XPath 的方式,這裡用個簡單的 XML 當例子:

# devtools::install_github("hrbrmstr/xmlview")
library(xml2)
library(xmlview)
library(magrittr)

## plain text XML
xml_view("<note><to>Dale</to><from>Chip</from><heading>Reminder</heading><body>Baby, don't forget tonight! xxxxx</body></note>")

利用 xml_view 這個函數吃進 XML string,即可得到 Parsed 後的顯示,

xml_view_test

XPath 測試

用 PTT 的隨便一篇文章當範例,先把網頁的內容抓 下來,並用 read_html 做成 xml_document 物件:

## read-in XML document
doc <- xml2::read_html("https://www.ptt.cc/bbs/Stock/M.1452818794.A.FEC.html",
                encoding = "UTF-8")
# xml_view(doc, add_filter = TRUE)

由於 read_html 會自動將內容轉換成 unmarked UTF-8 encoding,經測試吃進時xml_view無法顯示,所以必須先轉換成 marked UTF-8 encoding 或 system locale (e.g., Big5) 才能正確顯示,因此這裡先把 xml_document 直接轉成 character 後再調整 encoding,

doc_string <- as.character(doc) %>% `Encoding<-`("UTF-8")
xml_view(doc_string, add_filter=TRUE)

xml_view_ptt_result

吃進去 xml_view 後,在 RStudio 的 Viewer pane 顯示了剛才的網頁內容,因為加了add_filter=TRUE 這個參數,因此上方出現了 XPath 的輸入框,輸入想測試的 XPath expression 後直接按 enter 就會馬上跑出結果,還可以按下”R”的圖示自動產生 R code 可直接複製貼上。

xml_view_ptt_xpath

最後就得到想要的資料了!

xml_find_all(doc, '//span[@class="f3 push-content"]', ns=xml2::xml_ns(doc))

## or you want to use rvest package
# doc %>% rvest::html_nodes(xpath = '//span[@class="f3 push-content"]')

只是在 Windows 的 encoding 問題還是要再處理一下,

doc %>%
  rvest::html_nodes(xpath = '//span[@class="f3 push-content"]') %>%
  rvest::html_text() %>%
  `Encoding<-`("UTF-8") %>%
  gsub("^: ", "",.)

## [1] "他,還有隱形眼鏡"
## [2] "她,還有雙鏡頭"
## [3] "蘋果怎麼可能容忍供應商EPS180但又不降價?"
## [4] "它,還有眼鏡蛇"
## [5] "不要看新聞做股票吧"
## [6] "外資要壓低吃貨囉"
## [7] "再爛股價還是會維持四位數啦"