rvest:在特定(标题)字符串

时间:2017-04-13 13:57:16

标签: r web-scraping rvest rselenium

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

我想只刮一个或多个标题前面的表格 “Tabela xx程序ICD-9”,其中xx不是固定数字。

页面上可能有1个但偶尔会有2-3个这样的表格。并且它们可以与其他页面以不同的顺序出现,因此无法在网站上指明我想要的第n页。

例如,我只对同一页面中以“Icd-9 main”字符串开头的表格感兴趣并跳过其他表格。有2个这样的表,我想把他们的内容写到data.frame。它们可能与下面的顺序不同,所以我必须依赖前面的字符串。有时根本就没有Icd-9主表。

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/

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]]

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

然而在我的情况下,我永远不知道要刮哪个表,顺序可能会有所不同,它可以是2个表格,前面是一个包含“Tabela xx:procedury ICD-9”的字符串

我的问题是,如何根据预先标题或描述字符串选择和删除html表。或者仅在包含例如“Tabela xx procedure ICD-9”的字符串后立即出现的一个或多个表格

1 个答案:

答案 0 :(得分:4)

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