删除标题下的所有子段落(最好是rvest)

删除标题下的所有子段落(最好是rvest),r,css-selectors,web-scraping,rvest,R,Css Selectors,Web Scraping,Rvest,我的目标是在一个相当大的word文档上使用librarytm工具包。word文档有合理的排版,所以我们的主要部分有h1,一些H2和h3副标题。我想比较和文本挖掘每个章节,每个h1下面的文本-副标题不重要-因此它们可以被包括或排除 我的策略是将worddocument导出为html,然后使用rvestpacakge来提取段落 library(rvest) # the file has latin-1 chars #Sys.setlocale(category="LC_ALL", locale="d

我的目标是在一个相当大的word文档上使用librarytm工具包。word文档有合理的排版,所以我们的主要部分有h1,一些H2和h3副标题。我想比较和文本挖掘每个章节,每个h1下面的文本-副标题不重要-因此它们可以被包括或排除

我的策略是将worddocument导出为html,然后使用rvestpacakge来提取段落

library(rvest)
# the file has latin-1 chars
#Sys.setlocale(category="LC_ALL", locale="da_DK.UTF-8")
# small example html file
file <- rvest::html("https://83ae1009d5b31624828197160f04b932625a6af5.googledrive.com/host/0B9YtZi1ZH4VlaVVCTGlwV3ZqcWM/tidy.html", encoding = 'utf-8')

nodes <- file %>%
  rvest::html_nodes("h1>p") %>%
  rvest::html_text()
我可以用html_nodesp提取所有,但那只是一个大汤。我需要分别分析每个h1

最好的可能是一个列表,每个h1标题都有一个p标签向量。可能是一个循环,类似于1中的i:lengthhtml\u nodesfil,h1 html\u childrenhtml\u nodesfil,h1[i],它不起作用

如果有一种方法可以从rvest中整理单词html,那就有好处了;您当前使用的选择器查找h1的子元素p元素,h1在HTML中没有意义,因此不返回任何内容

如果检查生成的标记(至少在您提供的示例文档中),您会注意到每个h1元素以及目录的标题(标记为p)都有一个关联的父div:

indholdsfortagnelse

... 采访医学博士雅各布·斯科莱德 a_skolen ... 安德烈亚斯·斯科莱德医生访谈录 b_skolen ... 用h1表示的每个部分中的所有p元素都可以在其各自的父div中找到。考虑到这一点,您可以简单地选择每个h1的同级p元素。但是,由于rvest目前没有从上下文节点中选择同级的方法,html_节点仅支持查看节点的子树,即其后代,因此您需要以另一种方式执行此操作

假设HTML Tidy创建了一个结构,其中每个h1都位于正文内的div中,则可以使用以下选择器获取除目录之外的每个div:

sections <- html_nodes(file, "body > div ~ div")
如您所见,lengthparas对应于每个div中p元素的数量。请注意,其中一些元素只包含一个元素,这可能会根据您的需要带来麻烦。我将把处理这些异常值作为练习留给读者

不幸的是,由于rvest不提供自己的HTML功能,所以我没有额外的积分。您需要单独处理Word文档。

您可以使用包装libtidy的软件包,直接在R中整理难看的Word生成的HTML。
for (section in sections) {
  paras <- html_nodes(section, "p")
  # Do stuff with paragraphs in each section...

  print(length(paras))
}
# [1] 9
# [1] 8