Есть ли в R простой способ извлечь только текстовые элементы HTML-страницы? - PullRequest
22 голосов
/ 07 июля 2010

Есть ли в R простой способ извлечения только текстовых элементов HTML-страницы?

Я думаю, что это известно как «очистка экрана», но у меня нет опыта, мне просто нужноспособ извлечения текста, который вы обычно видите в браузере при посещении URL.

Ответы [ 4 ]

23 голосов
/ 07 июля 2010

Я должен был сделать это однажды сам.

Один из способов сделать это - использовать выражения XPath.Эти пакеты понадобятся вам из репозитория по адресу http://www.omegahat.org/

library(RCurl)
library(RTidyHTML)
library(XML)

. Мы используем RCurl для подключения к интересующему веб-сайту.Он имеет множество опций, которые позволяют вам получить доступ к веб-сайтам, с которыми у стандартных функций в базе R возникнут трудности, я думаю, это будет справедливо сказать.Это R-интерфейс библиотеки libcurl.

Мы используем RTidyHTML для очистки искаженных веб-страниц HTML, чтобы их было легче анализировать.Это R-интерфейс библиотеки libtidy.

Мы используем XML для анализа кода HTML с помощью наших выражений XPath.Это R-интерфейс библиотеки libxml2.

В любом случае, вот что вы делаете (минимальный код, но опции доступны, см. Справочные страницы с соответствующими функциями):

u <- "http://stackoverflow.com/questions/tagged?tagnames=r" 
doc.raw <- getURL(u)
doc <- tidyHTML(doc.raw)
html <- htmlTreeParse(doc, useInternal = TRUE)
txt <- xpathApply(html, "//body//text()[not(ancestor::script)][not(ancestor::style)][not(ancestor::noscript)]", xmlValue)
cat(unlist(txt))

Таммогут быть некоторые проблемы с этим подходом, но я не могу вспомнить, что они находятся у меня в голове (я не думаю, что мое выражение xpath работает со всеми веб-страницами, иногда оно может не отфильтровать код скрипта или может простопросто не работать с некоторыми другими страницами, лучше всего поэкспериментировать!)

PS Еще один способ, который работает почти идеально, я думаю, что при веб-очистке всего текста из html заключается в следующем (в основном, Internet Explorer делает преобразование)для вас):

library(RDCOMClient) 
u <- "http://stackoverflow.com/questions/tagged?tagnames=r"
ie <- COMCreate("InternetExplorer.Application") 
ie$Navigate(u)
txt <- list()
txt[[u]] <- ie[["document"]][["body"]][["innerText"]] 
ie$Quit() 
print(txt) 

ОДНАКО, мне никогда не нравилось делать это, потому что это не только медленно, но если вы векторизуете его и применяете вектор URL, если Internet Explorer вылетает на плохой странице,тогда R может зависнуть или зависнуть сам (я не думаю, что попытка очень помогает в этом случае).Также он допускает всплывающие окна.Я не знаю, прошло уже много времени с тех пор, как я это сделал, но подумал, что должен указать на это.

3 голосов
/ 03 сентября 2018

Лучшим решением является пакет htm2txt.

library(htm2txt)
url <- 'https://en.wikipedia.org/wiki/Alan_Turing'
text <- gettxt(url)

Подробнее см. https://CRAN.R -project.org / package = htm2txt .

3 голосов
/ 08 июля 2010

Мне повезло с функцией readHTMLTable () пакета XML. Возвращает список всех таблиц на странице.

> library(XML)
> url <- 'http://en.wikipedia.org/wiki/World_population'
> allTables <- readHTMLTable(url)

На каждой странице может быть много таблиц.

> length(allTables)
[1] 17

Так что просто выберите тот, который вы хотите.

> tbl <- allTables[[3]]

Самой большой проблемой может быть установка пакета XML. Он большой и нуждается в библиотеке libxml2 (а в Linux также необходим пакет Debian с конфигурацией xml2). Вторая по значимости проблема заключается в том, что таблицы HTML часто содержат ненужные ненужные данные, помимо данных, которые вам нужны.

3 голосов
/ 07 июля 2010

Ну, это не совсем R способ сделать это, но это так просто, как они приходят: перехитрить плагин для Firefox.Базовая версия бесплатна и помогает извлекать таблицы и прочее.

ах, и если вы действительно хотите сделать трудный путь в R, эта ссылка для вас:

...