Как построить веб-браузер в R, используя readLines и grep? - PullRequest
5 голосов
/ 31 октября 2011

Я совсем новичок в Р. Я хочу собрать корпус из 1 миллиона слов газетных статей. Поэтому я пытаюсь написать веб-скребок для получения газетных статей, например. сайт опекуна: http://www.guardian.co.uk/politics/2011/oct/31/nick-clegg-investment-new-jobs.

Скребок предназначен для запуска на одной странице, извлечения основного текста статьи, удаления всех тегов и сохранения его в текстовом файле. Затем следует перейти к следующей статье по ссылкам на этой странице, получить статью и т. Д., Пока файл не будет содержать около 1 миллиона слов.

К сожалению, мой скребок продвинулся не очень далеко.

Я использовал readLines (), чтобы добраться до источника веб-сайта, и теперь хотел бы получить соответствующую строку в коде.

В соответствующем разделе Guardian этот идентификатор используется для обозначения основного текста статьи:

<div id="article-body-blocks">         
  <p>
    <a href="http://www.guardian.co.uk/politics/boris"
       title="More from guardian.co.uk on Boris Johnson">Boris Johnson</a>,
       the...a different approach."
  </p>
</div>

Я пытался заполучить этот раздел, используя различные выражения с помощью grep и lookbehind - пытаясь получить строку после этого идентификатора - но я думаю, что она не работает через несколько строк. По крайней мере, я не могу заставить его работать.

Кто-нибудь может помочь? Было бы здорово, если бы кто-нибудь мог предоставить мне код, над которым я мог бы продолжить работу!

Спасибо.

1 Ответ

14 голосов
/ 01 ноября 2011

Вы столкнетесь с проблемой очистки очищенной страницы, если действительно настаиваете на использовании grep и readLines, но это, конечно, можно сделать.Например:

1004 * Загрузите страницу:
html <- readLines('http://www.guardian.co.uk/politics/2011/oct/31/nick-clegg-investment-new-jobs')

И с помощью пакета str_extract из stringr и простого регулярного выражения все готово:

library(stringr)
body <- str_extract(paste(html, collapse='\n'), '<div id="article-body-blocks">.*</div>')

Ну, body выглядит ужасно, вам придется очистить его от <p> и сценариев тоже.Это можно сделать с gsub и друзьями (хорошие регулярные выражения).Например:

gsub('<script(.*?)script>|<span(.*?)>|<div(.*?)>|</div>|</p>|<p(.*?)>|<a(.*?)>|\n|\t', '', body)

Как и предполагал @Andrie, вам лучше использовать для этой цели несколько пакетов сборки.Небольшая демонстрация:

library(XML)
library(RCurl)
webpage <- getURL('http://www.guardian.co.uk/politics/2011/oct/31/nick-clegg-investment-new-jobs')
webpage <- readLines(tc <- textConnection(webpage)); close(tc)
pagetree <- htmlTreeParse(webpage, useInternalNodes = TRUE, encoding='UTF-8')
body <- xpathSApply(pagetree, "//div[@id='article-body-blocks']/p", xmlValue)

Где body приводит к чистому тексту:

> str(body)
 chr [1:33] "The deputy prime minister, Nick Clegg, has said the government's regional growth fund will provide a \"snowball effect that cre"| __truncated__ ...

Обновление : выше как однострочный (спасибо @Martin Morgan за предложение):

xpathSApply(htmlTreeParse('http://www.guardian.co.uk/politics/2011/oct/31/nick-clegg-investment-new-jobs', useInternalNodes = TRUE, encoding='UTF-8'), "//div[@id='article-body-blocks']/p", xmlValue)
...