Webscraping с R: Как я могу привести в порядок свои данные? - PullRequest
0 голосов
/ 09 апреля 2020

Я строю веб-скребок для некоторых новостных сайтов в Швейцарии. После некоторых проб и ошибок и большой помощи от StackOverflow (спасибо всем!) Я дошел до того, что смог получить текстовые данные из всех статей.

#packages instalieren

install.packages("rvest")
install.packages("tidyverse")
install.packages("dplyr")
library(rvest)
library(stringr)

#seite einlesen

apisrf<- read_xml('https://www.srf.ch/news/bnf/rss/1646')

urls_srf <- apisrf %>% html_nodes('link') %>% html_text()
zeit_srf <- apisrf %>% html_nodes('pubDate') %>% html_text()

#data.frame basteln

dfsrf_titel_text <- data.frame(Text = character())

#scrap

for(i in 1:length(urls_srf)) {
  link <- urls_srf[i]

  artikel <- read_html(link)

  #Informationen entnehmen
  textsrf<- artikel %>% html_nodes('p') %>% html_text()

  #In Dataframe strukturieren

  dfsrf_text <- data.frame(Text = textsrf)

  dfsrf_titel_text <- rbind(dfsrf_titel_text, cbind(dfsrf_text))  

}

выполнение этого дает мне dfsrf_titel_text. (Я собираюсь объединить это с названиями статей в какой-то момент, но пусть это будет моей проблемой.)

однако, теперь мои данные довольно неопрятны, и я не могу понять, как очистить таким образом, это работает для меня. Особенно раздражает то, что тексты из разных статей на самом деле не структурированы таким образом, а получают новую строку, когда в текстах есть абзац. Я не могу объединить абзацы, потому что все тексты имеют разную длину. (Первая статья, начиная с пункта 3, очень длинная, потому что она представляет собой тикер, рассказывающий о коронном кризисе, поэтому не запутайтесь, если вы запустите мой код.)

как мне заставить R создать новый строка в моем фрейме данных, только если текст взят из новой статьи (имеется в виду новый URL?

спасибо за вашу помощь!

Ответы [ 2 ]

2 голосов
/ 09 апреля 2020

можете ли вы предоставить образец ваших данных? вы можете использовать функцию strsplit(string, pattern), где указанный вами шаблон - это то, что происходит только между статьями. Возможно URL?

strsplit(dfsrf_text,"www.\\w+.ch")

Это разделит ваш текст каждый раз, когда будет найден URL в домене .ch. Вы можете использовать этот шпаргалку регулярного выражения , чтобы помочь вам определить шаблон, разделяющий ваши статьи.

0 голосов
/ 09 апреля 2020

Вы должны исправить это при создании самого фрейма данных. Здесь я связываю все эти данные для каждой статьи, используя paste0, добавляя между ними символ новой строки (\n\n).

library(rvest)

for(i in 1:length(urls_srf)) {
    link <- urls_srf[i]
    artikel <- read_html(link)
    #Informationen entnehmen
    textsrf<- paste0(artikel %>% html_nodes('p') %>% html_text(), collapse = "\n\n")
    #In Dataframe strukturieren
    dfsrf_text <- data.frame(Text = textsrf)
    dfsrf_titel_text <- rbind(dfsrf_titel_text, cbind(dfsrf_text))  
}

Однако растущие данные в oop крайне неэффективно и может ужасно замедлить процесс, особенно когда у вас есть большие данные для такой обработки. Попробуйте использовать sapply.

dfsrf_titel_text <- data.frame(text = sapply(urls_srf, function(x) {
    paste0(read_html(x) %>% html_nodes('p') %>% html_text(), collapse = "\n\n")
}))

Таким образом, вы получите количество строк, равное длине urls_srf.

...