Соскоб с Rvest с переменными тегами - PullRequest
0 голосов
/ 07 июня 2018

моя проблема

Я пытаюсь очистить документы с этого URL:

url <- https://www.bger.ch/ext/eurospider/live/de/php/aza/http/index.php?lang=de&type=simple_query&query_words=&lang=de&top_subcollection_aza=all&from_date=01.01.2017&to_date=05.01.2017&x=0&y=0

Код одного интересующего документа выглядит так:

<span class="rank_title">
                  <a href="https://www.bger.ch/ext/eurospider/live/de/php/aza/http/index.php?lang=de&amp;type=highlight_simple_query&amp;page=1&amp;from_date=01.01.2017&amp;to_date=05.01.2017&amp;sort=relevance&amp;insertion_date=&amp;top_subcollection_aza=all&amp;query_words=&amp;rank=5&amp;azaclir=aza&amp;highlight_docid=aza%3A%2F%2F05-01-2017-2C_826-2015&amp;number_of_ranks=67" title="Seite mit hervorgehobenen Suchbegriffen öffnen">05.01.2017 2C 826/2015</a>
</span>
   <span class="published_info small normal">
      <a href="https://www.bger.ch/ext/eurospider/live/de/php/aza/http/index.php?lang=de&amp;type=highlight_simple_query&amp;page=1&amp;from_date=01.01.2017&amp;to_date=05.01.2017&amp;sort=relevance&amp;insertion_date=&amp;top_subcollection_aza=all&amp;query_words=&amp;highlight_docid=atf%3A%2F%2F143-I-73%3Ade&amp;azaclir=aza">publiziert</a>
   </span>
<div class="rank_data">
      <div class="court small normal">
      IIe Cour de droit public
   </div>

      <div class="subject small normal">
      Finances publiques &amp; droit fiscal
   </div>

      <div class="object small normal">
      Impôts communal et cantonal 2009, impôt sur la fortune; estimation de titres non cotés, garantie de la propriété
   </div>
   </div>               </li>

Я заинтересован в занятиях: "rank_title", "published info small normal", "subject small normal" и "object small normal".И я хотел бы сохранить эту информацию в кадре данных.

Однако не все документы будут иметь все классы (например, на этой странице только один документ имеет класс "published info small normal".

Если"published info small normal" доступно, я в основном заинтересован в извлечении заголовка этого документа, в этом примере:

143 I 73

Редактировать Если сценарий извлекает «publiziert» только при наличии "published info small normal", это будет хорошо.

мой подход

Я нашел сообщение, котороекажется очень полезным для моей проблемы Очистка с помощью rvest - в комплекте с NA, когда тега нет

Я начал реализовывать это:

library(XML)
doc <- xmlTreeParse(url, asText = TRUE, useInternalNodes = TRUE)

Однако я не знаюкак реализовать код для переменных узлов.

1 Ответ

0 голосов
/ 08 июня 2018

Нашел решение:

#read the html
pg <- read_html("url <- https://www.bger.ch/ext/eurospider/live/de/php/aza/http/index.php?lang=de&type=simple_query&query_words=&lang=de&top_subcollection_aza=all&from_date=01.01.2017&to_date=05.01.2017&x=0&y=0")

xdf <- pg %>% 
        html_nodes("div.ranklist_content ol li")  %>%    # select enclosing nodes
        # iterate over each, pulling out desired parts and coerce to data.frame
      map_df(~list(link = html_nodes(.x, ".rank_title a") %>% 
                     html_attr("href") %>% 
                     {if(length(.) == 0) NA else .},    # replace length-0 elements with NA
                 title = html_nodes(.x, ".rank_title a") %>% 
                   html_text() %>% 
                   {if(length(.) == 0) NA else .},
                 publication_link = html_nodes(.x, ".published_info a") %>% 
                    html_attr("href") %>% 
                 {if(length(.) == 0) NA else .},  

                  publication = html_nodes(.x, ".published_info a") %>% 
                   html_text() %>% 
                   {if(length(.) == 0) NA else .},

                 court = html_nodes(.x, ".rank_data .court") %>% 
                   html_text(trim=TRUE) %>% 
                   {if(length(.) == 0) NA else .},

                 subject = html_nodes(.x,  ".rank_data .subject") %>% 
                   html_text(trim=TRUE) %>% 
                   {if(length(.) == 0) NA else .},
                 object = html_nodes(.x,   ".rank_data .object") %>% 
                   html_text(trim=TRUE) %>% 
                   {if(length(.) == 0) NA else .}))

Было бы очень хорошо, если бы кто-нибудь мог помочь мне извлечь название class="published_info small normal".

...