2015-10-27 42 views
0

我的目標是從下載的html新聞服務文件中提取新聞文章的日期頻率。第1步:從html文件中提取日期。第2步:計算特定日期的文章頻率。使用R和正則表達式使用XML庫解析來自非結構化html的數據

雖然我不是XML專家,但我很努力地解析數據,因爲文件似乎相對沒有結構化。我的過程中一直如下:

library(XML) 
test <- htmlParse('Xi.html') 
rt <- xmlRoot(test) 

table(names(rt)) 

這產生了:

body head 
    1 1 

table(unlist(xmlApply(rt,names))) 

返回:

a  b br font hr meta style table 
1  1  3  2  2  1  2 661 
text title 
    3  1 

如此看來多數信息的表格中。然而,這些結構不是以可通過htmlTable()檢索的方式構建的,因爲數據是在單獨的行中顯示的,但是這些列有效地連接在一起,沒有文本分隔。

nodeset <- getNodeSet(test,"//table") 
head(nodeset) 

[[1]] 
<table border="0" cellpadding="0" cellspacing="0" width="100%"> 
    <tr bgcolor="#f1f1f1"> 
    <td align="left" height="36"> 
       <img src="http://XXXXX.gif"/></td> 
    </tr> 
</table> 

[[2]] 
<table width="100%" style="table-layout:fixed;"> 
    <tr><td width="30px" valign="top"><font size="2">1. </font></td> 
<td><font size="3">港人喜見黃金馬車 馳向中英關係黃金時代</font> 

<font size="2" face="Arial">[Ta Kung Pao] 2015-10-27 B21 通識新世代 中英社評 </font> </td> 
</tr> 
    <tr><td colspan="2"> 
<table width="100%"/></td> 
</tr> 
</table> 

[[3]] 
<table width="100%"/> 
[[4]] 
<table width="100%" style="table-layout:fixed;"> 
    <tr><td width="30px" valign="top"><font size="2">2. </font></td> 
<td><font size="3">High-level exchanges between China and ROK</font> 

<font size="2" face="Arial">[China Daily] 2015-10-27  Asia-Pacific  </font> </td> 
</tr> 
    <tr><td colspan="2"> 
<table width="100%"/></td> 
</tr> 
</table> 

[[5]] 
<table width="100%"/> 

因此,而不是試圖通過某種方式創建一個數據幀中提取數據,我想我唯一的選擇是使用正則表達式來從整個文本中提取的日期。我想第一步,這樣做可能是「]」,其中文件中的所有日期的位置,所以我嘗試後執行列表中的字符串分割:

b <- unlist(strsplit(test,"]")) 

但這返回你的錯誤:

Error in strsplit(test, "]") : non-character argument 

我很感激任何幫助讓我走上正軌。

所有時間都在下面的格式:

2015-10-27 

回答

1

我知道[R只有一點點,但strsplit需要一個字符串。你給它test,這是htmlParse的結果,似乎是某種樹。


的r regular expressions要麼延伸類似Perl。爲了滿足所有時間,無論您可以使用

\d\d\d\d-\d\d-\d\d 

翻翻strsplit手冊是什麼,它似乎是用於提取日期錯誤的工具。你應該看看grep。類似於

dates <- grep("\d\d\d\d-\d\d-\d\d", htmltext, value = TRUE) 

可能工作,應該返回日期。