如何刮除表格前的一些标题文本从PDF?我正在试验制表机的包装。这里是一个从特定页面获取表的示例(波兰“公共卫生需求地图”)
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(.)“,因为这些表可能不在同一页,非常感谢预先提出的任何方向和想法。
编辑:在我问了这个问题之后,到目前为止,我成功地找到了表所在的页面,可能非常无效:
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()发布于 2019-04-03 16:52:11
我可以帮你解决你的基本问题,但有一个问题(见最后)。我使用pdftools而不是pdfsearch,但在本例中,它基本上也是这样做的(用表查找页面)。为了节省时间,我开始时只下载了一次PDF:
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:
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是可搜索的,我们只保留与您的关键字相匹配的行:
tables <- pages %>%
filter(grepl("Tabela .* Struktura zapadalnosci", text))有8行符合关键短语。我们只从这些表格中提取表格。此外,lapply循环中的函数只保留最多行的矩阵。如果一个页面上有两个表,这可能是一个问题,但通常情况下,只使用tabulizer查找表结构所做的“最佳猜测”是很好的。
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列表,每个列表都是一个转换后的表:
> 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中
> 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比较:

这似乎很有效,只是列名不见了。不知道是否有办法保留他们,但这并没有包括在你的问题中,所以也许你已经有了解决办法?
发布于 2019-04-03 15:26:43
你应该试试爬行器。
它的主要Rcrawler函数似乎是专门为您的需要而设计的--带有它的KeywordsFilter参数:
KeywordsFilter 字符向量,对于那些希望只包含一个或多个关键字的网页的用户来说。Rcrawler根据已建立的关键字的数量计算一个精确的分数。此参数必须是具有至少一个关键字的向量,如c(“must”)。
https://stackoverflow.com/questions/54403728
复制相似问题