使用R和regex使用XML库

时间:2015-10-27 06:34:15

标签: regex xml r html-parsing

我的目标是从下载的html新闻服务文件中提取新闻文章的日期频率。第1步:从html文件中提取日期。第2步:计算特定日期的文章频率。

我正在努力解析数据,因为文件似乎相对非结构化,尽管我不是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%"/> 

因此,我认为我唯一的选择是使用正则表达式从整个文本中提取日期,而不是尝试通过某种方式创建数据框来提取数据。我认为这样做的第一步可能是在&#34;]&#34;之后在列表上执行字符串拆分。文件中的所有日期都在哪里,所以我试过了:

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

但是这会返回错误:

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

我很感激能帮助我走上正轨。

所有日期均采用以下格式:

2015-10-27

1 个答案:

答案 0 :(得分: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)

可能有用,应该返回日期。