首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中的Tabulizer包:如何在特定标题之后刮表

R中的Tabulizer包:如何在特定标题之后刮表
EN

Stack Overflow用户
提问于 2019-01-28 14:08:12
回答 2查看 1.6K关注 0票数 6

如何刮除表格前的一些标题文本从PDF?我正在试验制表机的包装。这里是一个从特定页面获取表的示例(波兰“公共卫生需求地图”)

代码语言:javascript
复制
library(tabulizer)
library(tidyverse)
options(java.parameters = "-Xmx8000m")

location<-"http://www.mpz.mz.gov.pl/wp-content/uploads/sites/4/2019/01/mpz_choroby_ukladu_kostno_miesniowego_woj_dolnoslaskie.pdf"

(out<-extract_tables(location, pages = 8,encoding = "UTF-8", method = "stream", outdir = getwd())[[4]] %>%
as.tibble())

这给我提供了一张特定页面的桌子。但我将有很多这样的pdfs刮,从网站:http://www.mpz.mz.gov.pl/mapy-dla-30-grup-chorob-2018/,然后有许多链接的每一种疾病,得到的链接,每个省的波兰,我需要刮表后,一个特定的标题字符串,例如。

Tabela 1.2.2: Struktura zapadalnosci rejestrowanej w zależności od płci,miejsca zamieszkania oraz grupy wiekowej - Choroby układowe tkankiłącznej“

我要查出Tabela(.)Struktura zapadalnosci(.)“,因为这些表可能不在同一页,非常感谢预先提出的任何方向和想法。

编辑:在我问了这个问题之后,到目前为止,我成功地找到了表所在的页面,可能非常无效:

代码语言:javascript
复制
library(pdfsearch)

pages <-
  keyword_search(
    location,
    keyword = c(
      'Tabela',
      'Struktura zapadalnosci rejestrowanej'
    ),
    path = TRUE,
    surround_lines = FALSE
  ) %>%
  group_by(page_num) %>%
  mutate(keyword = paste0(keyword, collapse = ";")) %>%
  filter(
    str_detect(keyword, "Tabela") &
      str_detect(keyword, "Struktura zapadalnosci rejestrowanej")
  ) %>%
  pull(page_num) %>%
  unique()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-03 16:52:11

我可以帮你解决你的基本问题,但有一个问题(见最后)。我使用pdftools而不是pdfsearch,但在本例中,它基本上也是这样做的(用表查找页面)。为了节省时间,我开始时只下载了一次PDF:

代码语言:javascript
复制
options(java.parameters = "-Xmx8000m")# needs to be set before loading tabulizer
library(tabulizer)
library(tidyverse)

location <- "http://www.mpz.mz.gov.pl/wp-content/uploads/sites/4/2019/01/mpz_choroby_ukladu_kostno_miesniowego_woj_dolnoslaskie.pdf"
download.file(location, "test.pdf", mode = "wb")

现在,将pdf转换为df行中每一行的data.frame:

代码语言:javascript
复制
raw <- pdftools::pdf_data("test.pdf") 
pages <- lapply(seq_along(raw), function(p) {
  if (nrow(raw[[p]]) > 0) {
    raw[[p]]$page <- p
    raw[[p]]
  }
}) %>% 
  bind_rows() %>% 
  group_by(y, page) %>% 
  summarise(text = paste(text, collapse = " ")) %>% 
  arrange(page, y)

这个data.frame是可搜索的,我们只保留与您的关键字相匹配的行:

代码语言:javascript
复制
tables <- pages %>% 
  filter(grepl("Tabela .* Struktura zapadalnosci", text))

有8行符合关键短语。我们只从这些表格中提取表格。此外,lapply循环中的函数只保留最多行的矩阵。如果一个页面上有两个表,这可能是一个问题,但通常情况下,只使用tabulizer查找表结构所做的“最佳猜测”是很好的。

代码语言:javascript
复制
tables_list <- lapply(tables$page, function(p) {
  cat(p, "\n")
  out <- extract_tables("test.pdf", 
                        pages = p,
                        encoding = "UTF-8", 
                        method = "stream", 
                        output = "matrix")
  out <- as_tibble(out[[which.max(sapply(out, nrow) + sapply(out, ncol))]]) # keep the biggest table
  attr(out, "caption") <- tables$text[tables$page %in% p]
  return(out)
})

对象tables_list现在包含一个data.frames列表,每个列表都是一个转换后的表:

代码语言:javascript
复制
> tables_list[[1]]
# A tibble: 16 x 8
   V1                  V2    V3    V4    V5    V6    V7    V8   
   <chr>               <chr> <chr> <chr> <chr> <chr> <chr> <chr>
 1 dolnośląskie        77,05 74,65 4,04  10,59 13,37 27,87 44,14
 2 kujawsko-pomorskie  78,12 65,93 4,29  14,96 14,82 27,01 38,92
 3 lubelskie           76,50 56,83 2,67  14,83 17,00 29,00 36,50
 4 lubuskie            79,10 76,23 4,92  12,70 12,70 30,74 38,93
 5 łódzkie             74,37 67,77 6,45  13,84 15,09 30,03 34,59
 6 małopolskie         72,71 55,35 6,99  14,63 12,01 25,87 40,50
 7 mazowieckie         76,31 68,52 5,89  12,11 12,30 27,03 42,67
 8 opolskie            79,55 54,65 4,83  10,04 17,47 26,02 41,64
 9 podkarpackie        75,10 47,32 7,57  14,86 18,29 25,31 33,98
10 podlaskie           74,18 68,00 5,82  10,55 17,09 32,36 34,18
11 pomorskie           76,57 74,96 5,71  12,74 13,76 26,65 41,14
12 śląskie             73,51 81,15 4,89  14,96 14,43 26,64 39,08
13 świętokrzyskie      74,45 56,51 4,91  14,00 14,74 27,27 39,07
14 warmińsko-mazurskie 75,91 63,22 5,62  13,59 18,48 29,53 32,79
15 wielkopolskie       72,66 62,71 3,62  14,37 14,77 29,45 37,79
16 zachodniopomorskie  74,26 73,21 8,44  13,71 11,60 24,89 41,35

我还将每个表的(第一行)标题作为属性添加到data.frame

代码语言:javascript
复制
> attr(tables_list[[1]], "caption")
[1] "Tabela 1.2.2: Struktura zapadalnosci rejestrowanej w zależności od płci, miejsca zamieszkania oraz grupy"

将此与pdf比较:

这似乎很有效,只是列名不见了。不知道是否有办法保留他们,但这并没有包括在你的问题中,所以也许你已经有了解决办法?

票数 6
EN

Stack Overflow用户

发布于 2019-04-03 15:26:43

你应该试试爬行器

它的主要Rcrawler函数似乎是专门为您的需要而设计的--带有它的KeywordsFilter参数:

代码语言:javascript
复制
KeywordsFilter  

字符向量,对于那些希望只包含一个或多个关键字的网页的用户来说。Rcrawler根据已建立的关键字的数量计算一个精确的分数。此参数必须是具有至少一个关键字的向量,如c(“must”)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54403728

复制
相关文章

相似问题

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