2017-11-30 20 views
1

私は議題を含むウェブサイトからダウンロードした説明リストを持っており、成功していないdata.frameを作成しようとしています。 記述リストは、以下の構造を有する:<dl>タグからHTMLテキストを掻き集める

<dl> 
<dt> (which contains a <p = "day"> for day) 
<dd> (which contains a <p = "hour"> for hour and a <p = "event"> for the event) 

Iは、次のコードでこのデータを抽出するための管理:

library(rvest) 
url <- read_html("www.mypage.com") 
day <- data.frame(day = html_text(html_nodes(url, '.day'))) 
hour <- data.frame(hour = html_text(html_nodes(url, '.hour'))) 
event <- data.frame(event = html_text(html_nodes(url, '.event'))) 

day$ID <- seq.int(nrow(day)) 
hour$ID <- seq.int(nrow(hour)) 
event$ID <- seq.int(nrow(event)) 

そして私はIDによってそれらを接合することによりデータフレームを作成しました。日ごとに複数のイベントである

<dl> 
<dt> 
<dd> 
<dd> 
<dd> 

:私はこれを持っているとき

問題

です。 同じ <dt>に複数の <dd>が含まれている可能性を考慮して、data.frameを作成するにはどうすればよいですか?ありがとう!

+1

URLを共有していないと、違法行為または非倫理的行為を行っていることを示すことができないか、内部ページです。後者は理解できる、前者は理解できない。 HTMLの再現可能なスニペットを提供していません(コンテンツを持たない '

'の繰り返しは役に立たない)、他のノードクラスやIDが役立つかもしれません。だから、ターゲットURLの性質を少なくとも特定してください(私たちの中にはコンテンツの泥棒を助けません)、サンプルデータのより良いビットを含めるか、URLを提供してください。 – hrbrmstr

+0

ああ、申し訳ありません...私はポルトガル共和国の大統領の議題のためにデータを見ています。議題はここにあります:http://www.presidencia.pt/?idc=11&fano=2016 –

答えて

2

dl/dt/dd「HTMLクリエイターが私たちにこれを行うのはなぜですか」というものです。

library(rvest) 
library(tidyverse) 

pg <- read_html("http://www.presidencia.pt/?idc=11&fano=2016") 

# grab ALL the dt/dd elements under each dl into one big node list 
entries <- html_nodes(pg, xpath=".//dl[@id='ms_agend3']/*") 

# this finds all of the "dt" elements 
starts <- which(xml_name(entries) == "dt") 

# this tells us where ^^ "dd"'s stop 
ends <- c(starts[-1]-1, length(entries)) 

# it took 30s for me, so progress bars make the time pass visually 
pb <- progress_estimated(length(starts)) 

# now we iterate over the start/end pairs 
map2_df(starts, ends, ~{ 

    pb$tick()$print() # tick off the progress bar 

    # we're only going to work on the part of the node list for this dt/dd set 
    start <- .x 
    end <- .y 

    # get the day 
    dt <- html_text(entries[start], trim=TRUE) 

    # now iterate over each associated dd and pull out the info 
    map_df((start+1):end, ~{ 
    data_frame(
     hour = html_text(html_node(entries[.x], "div.hora"), trim=TRUE), 
     text = html_text(html_node(entries[.x], "div.texto"), trim=TRUE), 
    ) 
    }) %>% 
    mutate(day = dt) # add the day in 

}) %>% 
    select(day, hour, text) -> agenda # rearrange and store 

それはそれは、データフレームを作る方法による遅い少しだけど、それは私が前提と情報提供しているか、空白の時間を含む議題の日/時間/テキストを(キャプチャします。このSHLDは何をしたいあなたを得ます終日のイベント)。

この:

pb <- progress_estimated(length(starts)) 
map2_df(starts, ends, ~{ 

    pb$tick()$print() 

    start <- .x 
    end <- .y 

    data_frame(
    hour = html_text(html_nodes(entries[(start+1):end], "div.hora"), trim=TRUE), 
    text = html_text(html_nodes(entries[(start+1):end], "div.texto"), trim=TRUE), 
    day = html_text(entries[start], trim=TRUE) 
) 

}) %>% 
    select(day, hour, text) -> agenda 

は少し速くなると限り、私の目が私に言うのと同じ結果が得られます。

+0

素晴らしい!!!!私は解決策を見つけるために3日を費やしたと思っています!どうもありがとうございます。ありがとう。 –

+0

そこに掻き集めるよりぎこちないビットの1つ。 XPath 2.0はそれをより簡単にしますが、RやPythonの一般的なスクラップライブラリはサポートしていません。私はちょうど 'xml2'がこれらの回避策を可能にするのに十分な機能を公開していることを嬉しく思います。 – hrbrmstr

関連する問題