R和xpathApply - 从嵌套的html标记中删除重复项

时间:2014-12-02 07:34:11

标签: r xpath rcurl

为了简洁和清晰,我编辑了这个问题

我的目标是找到并导致" test1" ..." test8"单独列出。

我正在使用xpathApply从网页中提取文字。由于将从中提取信息的各种不同页面的布局,我需要从所有<font><p> html标记中提取XML值。我遇到的问题是当一个类型嵌套在另一个类型中时,当我使用具有xpathApply条件的以下or表达式时,会导致部分重复。

require(XML)    
html <- 
  '<!DOCTYPE html>
  <html lang="en">
    <body>
      <p>test1</p>
      <font>test2</font>
      <p><font>test3</font></p>
      <font><p>test4</p></font>
      <p>test5<font>test6</font></p>    
      <font>test7<p>test8</p></font>
    </body>
  </html>'
work <- htmlTreeParse(html, useInternal = TRUE, encoding='UTF-8')
table <- xpathApply(work, "//p|//font", xmlValue) 
table

应该很容易看到嵌套附带的问题类型 - 因为有时<font><p>标签是嵌套的,有时它们不是,我可以&#39 ; t忽略它们但是搜索两者给了我部分欺骗。出于其他原因,我更喜欢将文本片段分解而不是聚合(即,从最低级别/最远的嵌套标签中获取)。

我不仅仅是进行两次单独的搜索,然后在删除重复的字符串后附加它们的原因是我需要保留html中出现的文本顺序。

感谢阅读!

2 个答案:

答案 0 :(得分:1)

好的,我想出来了(完全是由于这篇文章:http://www.r-bloggers.com/htmltotext-extracting-text-from-html-via-xpath/

对我来说,答案就是在html中删除任何文本并清除一些不需要的东西,如:

table <- xpathApply(work, "//text()[not(ancestor::script)][not(ancestor::style)][not(ancestor::noscript)]", xmlValue)

答案 1 :(得分:1)

看起来这可能有效

xpathSApply(work, "//body//node()[//p|//font]//text()", xmlValue)
# [1] "test1" "test2" "test3" "test4" "test5" "test6" "test7" "test8"

只需切换到xpathApply即可获得列表结果。我们也可以使用getNodeSet

getNodeSet(work, "//body//node()[//p|//font]//text()", fun = xmlValue)
# [[1]]
# [1] "test1"
# 
# [[2]]
# [1] "test2"
# 
# [[3]]
# [1] "test3"
# 
# [[4]]
# [1] "test4"
# 
# [[5]]
# [1] "test5"
# 
# [[6]]
# [1] "test6"
# 
# [[7]]
# [1] "test7"
# 
# [[8]]
# [1] "test8"