2016-06-09 1 views
0

Я работаю над соскабливанием определенной части веб-сайта, который выглядит как таблица, но нет (к сожалению).Получите беспорядочные скребковые данные в data.frame в R

Я использую этот код ...

htmldoc <- read_html("http://www.wettportal.com/quotenvergleich/valuebets/") 

data <- htmldoc %>% 
    html_node(xpath='//*[(@id = "datagrid_content")]') %>% 
    html_text() 

# alternative css selector: "#datagrid_content" 

.. и получить этот вид продукции:

Fussball | Schweden | Cup\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n08.06.2016\r\nTipp\r\nVQ\r\nBuchmacher\r\n100%\r\nProfit\r\n\r\n\r\n\r\n\r\n19:00\r\nHuddinge IF - Enskede IK\r\n1 (DNB)\r\n1.73\r\nCoral\r\n1.50\r\n45.17%\r\n\r\n\r\n19:00\r\nHuddinge IF - Enskede IK\r\n1\r\n2.25\r\nCoral\r\n1.93\r\n35.00%\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n 

Как вы можете видеть, это действительно грязно и я до сих пор не было способный аккуратно получить его в data.frame.

Каждый получил представление о том, как либо

  • выбрать объект по-разному, чтобы получить выход claner с самого начала? (предпочтительно)
  • очистить данные таким образом, чтобы они вписывались в data.frame с такими столбцами: Спорт | Страна | Конкурс | Дата | Время | Team1 | Team2 ...?

спасибо.

ответ

1

Ну, есть некоторые вещи, которые делают это немного сложнее. Я использую другой подход для webscraping но код там может помочь вам немного

library(RCurl) 
library(XML) 
library(stringr) 
library(tidyr) 
url<-"http://www.wettportal.com/quotenvergleich/valuebets/" 
url2<-getURL(url) 
parsed<-htmlParse(url2,encoding = "UTF-8") 

info1<-xpathSApply(parsed,"//div[@id='datagrid_content']//h2/span[1]",xmlValue) 
date<-xpathSApply(parsed,"//th/time",xmlValue) 
df<-data.frame(matrix(unlist(str_split(info1," . ",n = 3)),nrow=length(info1),byrow=T)) 
colnames(df)<-c("Sport","Country","Competition") 
df<-cbind(df,date) 
time<-xpathSApply(parsed,"//div[@id='datagrid_content']//tbody/tr/td[1]",xmlValue) 
teams<-xpathSApply(parsed,"//div[@id='datagrid_content']//a/span",xmlValue) 
ID<-1 
for (i in 2:length(teams)){ 
    if (teams[i]==teams[i-1]){ 
     x<-max(ID,na.rm=TRUE) 
    } else { 
     x=max(ID,na.rm=TRUE)+1 
    } 
    ID<-c(ID,x) 

} 
df2<-cbind(teams,ID,time) 
df$ID<-1:nrow(df) 

final<-merge(df2,df) 
final<-separate(final,col = teams,into=c("team1","team2"),sep =" - ") 
final<-final[ ,c(5:8,4,2,3,1)] 

enter image description here

+0

Вау, спасибо большое! Я на самом деле надеялся на намек на возможные «трудовые удары» или что-то еще, но не ожидал, что кто-то пойдет по пути. Кроме того, благодарю вас за то, что вы показываете мне другой способ скреститься в сети в R ;-) –

+0

Еще один вопрос: какой инструмент вы используете, чтобы точно найти Xpath элемента? Я использую selectorGadget и F12 в Chrome, но он не показывает один и тот же Xpath для элементов, которые у вас есть в вашем коде ... –

+0

Ну, мой подход совсем другой. С помощью инструментов разработчика Chrome я обнаруживаю тег, где хранятся требуемые значения. E.G в случае командного вектора я заметил, что есть все в теге span. Но тогда может быть много тегов span на всей странице, поэтому я использовал «a/span», чтобы сигнализировать, что я хочу только разбить с одним тегом выше уровня. Я попытался запустить код, но он вернул еще несколько данных. Поэтому я ограничил выбор с помощью div как родителя.Таким образом, мой обычный подход начинается с тега, где есть значения, а затем добавлять родительские теги по мере необходимости, чтобы не указывать абсолютный путь –

0

Я не сделал то, что вы ожидали получить при выполнении кода, но он сделал именно то, что вы ему сказали: он возвращает все значение xml в div с id="datagrid_content".

  • Теперь, если вы хотите, чтобы data.frame, вы должны написать код, чтобы он дал вам data.frame.
  • Данные грязные, вы должны их очистить. Автоматического пути нет. Например, вы можете избавиться от некоторых специальных символов, а затем разделить данные с |: strsplit(gsub("\r|\n","",data)," | ")
  • Поскольку данные в таблицах, вы также можете сделать:

    данные < - HTMLDOC%>% html_nodes (XPath = '// * [@ класс = "таблицы типа Liga-1"]')%>% html_table()

Вы можете получить список data.frame.

Смежные вопросы