首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rvest:在特定(标题)字符串之后选择和刮除html表

rvest:在特定(标题)字符串之后选择和刮除html表
EN

Stack Overflow用户
提问于 2017-04-13 13:57:15
回答 1查看 2.8K关注 0票数 2

我正在尝试使用公共医疗数据来刮取以下网站:https://prog.nfz.gov.pl/app-jgp/Grupa.aspx?id=Qpc6nYOpOBQ%3d

我只想刮一个或多个表格,在表格前面有一个标题为"Tabela xx procedury ICD-9“,其中xx不是一个固定的数字。

页面上可能有1张,但偶尔也有2-3张这样的表格.而且它们可以与其他页面按不同的顺序出现,因此不可能在网站上表示我想要第n页。

例如,我只对前面有"Icd-9 main“字符串的同一页中的表感兴趣,并跳过其他字符串。有两个这样的表,我想把它们的内容刮到一个data.frame上。它们可能不会按照下面的顺序出现,因此I必须依赖于前面的字符串。偶尔也会没有Icd-9主桌。

代码语言:javascript
复制
Page
----
Icd-10
====
Table
====

Icd-9 main
====
Table
===

Icd-9 main
====
Table
====


Icd-9 supplementary
====
Table
===

我只知道按照本教程中的顺序选择第n个表的代码:

https://www.r-bloggers.com/using-rvest-to-scrape-an-html-table/

代码语言:javascript
复制
library("rvest")
url <- "http://en.wikipedia.org/wiki/List_of_U.S._states_and_territories_by_population"
population <- url %>%
  html() %>%
  html_nodes(xpath='//*[@id="mw-content-text"]/table[1]') %>%
  html_table()
population <- population[[1]]

将所有表转储到一个列表中,然后我们就可以按编号选择想要的表。

然而,在我的例子中,我永远不知道要刮哪个表,顺序可能会有所不同,它可以是两个表前面有一个字符串,其中包含"Tabela xx: procedury ICD-9“。

我的问题是,如何根据精确的标题或描述字符串来选择和刮html表。或仅在包含"Tabela ICD-9"的字符串之后出现的一个或多个表。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-19 05:02:12

代码语言:javascript
复制
library(rvest)
library(stringr)

doc <- read_html("https://prog.nfz.gov.pl/app-jgp/Grupa.aspx?id=Qpc6nYOpOBQ%3d")

# extract all the nodes that have the title (id = "tytul") or a table
# the cs selector "," is like a boolean OR. 
nodes <- doc %>% html_nodes(".tytul,table")

# loop though each node.
signal <- FALSE
my_tables <- list()
j <- 0
for (i in 1:length(nodes)) {

  # if title signal previously set and this is a table tag
  if (signal & html_name(nodes[i]) == "table") {
    cat("Match..\n")

    # get the table (data frame)
    this_table <- html_table(nodes[i], fill = TRUE, header = TRUE)[[1]]

    # append to list
    j = j + 1
    my_tables[[j]] <- this_table

    # and reset the signal so we search for the next one
    signal <- FALSE
  }

  # if the signal is clear look for matching title
  if (!signal) {
    signal <- nodes[i] %>% html_text() %>% str_detect("Tabela.+ICD 9")
  }
}
my_tables[[1]][1:5,]
my_tables[[2]][1:5,]

# > my_tables[[1]][1:5,]
# ICD 9                                                    Nazwa Lb. hospitalizacji UdziaĹ\u0082 (%) Mediana czasu pobytu (dni)
# 1 2.051       ZaĹ\u0082oĹźenie pĹ\u0082ytki sztucznej do czaszki                168            32,31                          7
# 2 1.247 Kraniotomia z usuniÄ\u0099ciem krwiaka podtwardĂłwkowego                 55            10,58                         20
# 3 2.022                       Odbarczenie zĹ\u0082amania czaszki                 43             8,27                          6
# 4 2.040                 Przeszczep kostny do koĹ\u009bci czaszki                 35             6,73                          8
# 5 1.093                        Inne aspiracje w zakresie czaszki                 33             6,35                          5
# > my_tables[[2]][1:5,]
# ICD 9                                         Nazwa Lb. hospitalizacji UdziaĹ\u0082 (%) Mediana czasu pobytu (dni)
# 1    O35                                     SĂłd (Na)                239            45,96                          8
# 2  89.00          Porada lekarska, konsultacja, asysta                230            44,23                          9
# 3    N45                                     Potas (K)                217            41,73                          8
# 4 87.030                  TK gĹ\u0082owy bez kontrastu                214            41,15                          9
# 5  89.04 Opieka pielÄ\u0099gniarki lub poĹ\u0082oĹźnej                202            38,85                          8
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43394268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档