Отобразить таблицу гиперссылок в read_html - PullRequest
0 голосов
/ 17 января 2020

У меня есть столбец, содержащий один столбец, в котором хранятся гиперссылки в каждом столбце. Теперь я хочу отобразить эти ссылки с помощью map_dfr, передавая ссылки одну за другой через read_html(.x[.x]) %>% html_node(".body-copy-lg") %>% html_text. Если я так делаю, я всегда получаю сообщение об ошибке:

Ошибка в файле_doc_parse_file (con, encoding = encoding, as_ html = as_ html, options = options): Ожидается одно строковое значение: [тип = символ; ext = 3].

Что говорит мне, что read_ html в основном говорит: «Эй, прекрати бросать на меня более одной строки одновременно».

Так я сделал ошибку в картографе? Это ошибка? Я действительно не понимаю, почему mapper-функция не захватывает каждый элемент один за другим.

То, что я до сих пор пробовал:

target_regex <- "(xtm)|((k|K)(i|I|1|11)(d|D)(n|N).)|(Ar<e)\\s(you)\\s(in)| 
(LOAN)|(AR(\\s|\\S)[0-9])|((B|b)(i|1|l)tc.)|(Coupon)|(Plastic.King)|(organs)|(SILI)|(Electric.Cigarette.Machine)"

adverts <- function(df) df[!grepl(target_regex, df$...1,perl = T), ]

bribe <- read_html(paste("http://ipaidabribe.com/reports/paid?page", 10, sep = "="))

report <- map(".read-more", ~html_nodes(bribe, .x) %>% 
    html_attr(.x[[1]][[1]][[1]], name = "href"))[[1]] %>% 
    as_tibble(.name_repair = "unique") %>% 
    bind_rows() %>% 
    rename( ...1 = value) %>% 
    adverts() %>%
    map_dfr(~read_html(.x[.x]) %>%  
    html_node(".body-copy-lg") %>% 
    html_text)

Не обращайте внимания на вызов rename(), который, по сути, является чем-то, что необходимо сделать, чтобы adverts можно было использовать в этом случае.

1 Ответ

1 голос
/ 17 января 2020

Вы забываете, что большинство функций в R векторизовано, и использование функций map или apply не нужно. В вашем случае это необходимо на последнем этапе получения текста html.

Синтаксис, который вы используете в map, также вызывает недоумение, и я думаю, что вам следует пересмотреть ?map, чтобы получить лучше справиться с этим. Например, вы используете несколько .x или извлеченных значений, где вы должны просто использовать .x для ссылки на подэлемент объекта, который вы перебираете.

library(tidyverse)
library(rvest)

target_regex <- "(xtm)|((k|K)(i|I|1|11)(d|D)(n|N).)|(Ar<e)\\s(you)\\s(in)| 
(LOAN)|(AR(\\s|\\S)[0-9])|((B|b)(i|1|l)tc.)|(Coupon)|(Plastic.King)|(organs)|(SILI)|(Electric.Cigarette.Machine)"

adverts <- function(df) df[!grepl(target_regex, df$...1,perl = T), ]

bribe <- read_html(paste("http://ipaidabribe.com/reports/paid?page", 10, sep = "="))

report <- html_nodes(bribe, ".read-more") %>% 
  html_attr("href") %>% 
  as_tibble(.name_repair = "unique") %>% 
  filter(str_detect(value, target_regex, negate = TRUE)) %>% 
  mutate(text = map_chr(value, ~read_html(.x) %>%  
                          html_node(".body-copy-lg") %>% 
                          html_text))

result

# A tibble: 3 x 2
  value                                                            text                                                                                                        
  <chr>                                                            <chr>                                                                                                       
1 http://ipaidabribe.com/reports/paid/paid-bribe-to-settle-matter… "\r\n                    Place: Nelamangala Police Station, Bangalore\nDate of incident:  5th Jan 2020, 3PM…
2 http://ipaidabribe.com/reports/paid/paid-500-rs-bribe-at-nizamu… "\r\n                        My Brother Mahesh Prasad travelling on PNR number 4822171124 train no 12721 Ni…
3 http://ipaidabribe.com/reports/paid/drone-air-follow-focus-wire… "\r\n                    This new Silencer Air+ is a tremendously versatile and resourceful follow focus, z…
...