6

PDFからタイトルテキストの前に表をスクレイピングする方法は? tabulizer パッケージを試しています。特定のページからテーブルを取得する例 (ポーランド語の「Map of Public Health Needs」)

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())

これにより、特定のページに 1 つのテーブルが表示されます。しかし、サイトからスクレイピングするためのそのようなPDFがたくさんあります:http://www.mpz.mz.gov.pl/mapy-dla-30-grup-chorob-2018/そして、各病気への多くのリンクを含むサブページ、ポーランドの各州の rvest とのリンクを取得し、特定のタイトル文字列の後にテーブルをスクレイピングする必要があります。

表 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()
4

2 に答える 2

6

基本的な問題についてはお手伝いできますが、問題が 1 つあります (最後を参照)。pdftools代わりに使用しますpdfsearchが、この場合は基本的に同じことをしています(テーブルのあるページを見つける)。時間を節約するために、最初に 1 回だけ 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")

次に、df の行の各行で pdf を 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ループ内の関数は、行数が最も多い行列のみを保持します。tabulizer1 ページに 2 つの表がある場合は問題になる可能性がありますが、一般的には、表の構造を見つけた「最良の推測」のみを使用するとうまくいきます。

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-03T16:52:11.387 に答える