Rvesting содержимое веб-страницы, возвращенное из html_text () - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь очистить (динамически c?) Контент с веб-страницы с помощью пакета rvest. Я понимаю, что для содержимого Dynami c необходимо использовать такие инструменты, как Selenium или Phantom JS.

Однако мои эксперименты наводят меня на мысль, что я все еще смогу найти нужный мне контент, используя только стандартные пакеты webscraping r (rvest, httr, xml2).

Для этого примера я буду использовать веб-страницу Google Maps. Вот пример url ...

https://www.google.com/maps/dir/920+nc-16-br, + denver, + n c, + 28037/2114 + hwy + 16, + denver, + n c, + 28037 /

Если вы перейдете по гиперссылке выше, вы попадете на пример веб-страницы. Содержимое, которое я хотел бы видеть в этом примере, это адреса «920 N C -16, Crumpler, N C 28617» и «2114 N C -16, Ньютон, N C 28658» в верхнем левом углу. угол веб-страницы.

Стандартные методы с использованием селектора css или xpath не работали, что изначально имело смысл, так как я думал, что это содержимое было динамическим c.

url<-"https://www.google.com/maps/dir/920+nc-16-br,+denver,+nc,+28037/2114+hwy+16,+denver,+nc,+28037/"
page<-read_html(url)

# The commands below all return {xml nodeset 0}
html_nodes(page,css=".tactile-searchbox-input")
html_nodes(page,css="#sb_ifc50 > input")
html_nodes(page,xpath='//*[contains(concat( " ", @class, " " ), concat( " ", "tactile-searchbox-input", " " ))]')

Приведенные выше команды возвращают «{xml nodeset 0}», который, как я думал, был результатом динамического генерирования этого содержимого, но вот моя путаница, если я преобразую всю страницу в текст с помощью html_text (), я могу найти адреса в возвращаемом значении.

html_text(read_html(url))
substring<-substr(x,33561-100,33561+300)

Выполнение вышеуказанных команд приводит к подстроке со следующим значением:

"null, null, null, null, [null, null, null, ноль, ноль, ноль, ноль, [[[\ " 920 N C -16, Крамплер, N C 28617 \", ноль, ноль, ноль, ноль, ноль, ноль, ноль , нуль, ноль, ноль, \ "Nzm5FTtId895YoaYC4wZqUnMsBJ2rlGI \"] \ n, [\ " 2114 N C -16, Ньютон, N C 28658 \", ноль, ноль, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, \ "RIU-FSdWnM8f-IiOQhDwLoMoaMWYNVGI \"] \ п] \ п, NULL, NULL, 0, NULL, [[NULL, NULL, NULL, NULL, null, null, null, 3] \ n, [null, null, null, null, [null, null, null, null, nu "

Подстрока очень грязная, но содержит содержимое, которое мне нужно. Я слышал, что анализ веб-страниц с использованием регулярных выражений не одобряется, но я не могу придумать какой-либо другой способ получения этого контента, который также позволил бы избежать использования динамических инструментов очистки 1051 *.

Если у кого-то есть предложения по синтаксическому анализу возвращенного html или я могу объяснить, почему я не могу найти содержимое с помощью селекторов xpath или css, но могу найти его, просто проанализировав необработанный текст html , будет очень признателен.

Спасибо за ваше время.

1 Ответ

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

Причина, по которой вы не можете найти текст с помощью селекторов Xpath или css, заключается в том, что найденная вами строка находится внутри содержимого объекта массива javascript. Вы были правы, предполагая, что текстовые элементы, которые вы видите на экране, загружаются динамически; это не то место, откуда вы читаете строки.

Я не думаю, что с синтаксическим анализом Speci c html с помощью регулярных выражений что-то не так. Я бы гарантировал, что получу полный html, а не только html_text(), в этом случае, используя пакет httr. Вы можете получить адрес со страницы следующим образом:

library(httr)

GetAddressFromGoogleMaps <- function(url)
{
  GET(url)                %>% 
  content("text")         %>%
  strsplit("spotlight")   %>%
  extract2(1)             %>%
  extract(-1)             %>%
  strsplit("[[]{3}(\")*") %>%
  extract2(1)             %>%
  extract(2)              %>%
  strsplit("\"")          %>%
  extract2(1)             %>%
  extract(1)
}

Сейчас:

GetAddressFromGoogleMaps(url)
#[1] "920 NC-16, Crumpler, NC 28617, USA"
...