Make HTML page (text) suitable for text analysis in R

47 Views Asked by At

I would like to do some text analytics on text from following web page: https://narodne-novine.nn.hr/clanci/sluzbeni/full/2007_07_79_2491.html

I don't know how to convert this HTML to tidy text object (every row in text is every row in dataframe). For example, just applying html_text() function doesn't help:

url <- "https://narodne-novine.nn.hr/clanci/sluzbeni/full/2007_07_79_2491.html"
p <- rvest::read_html(url, encoding = "UTF-8") %>%
  rvest::html_text()
p

since I don't have separated rows.

1

There are 1 best solutions below

0
On BEST ANSWER

That site has some very well-structured HTML with the headers and the body text of the section each given their own align attributes. We can use that to extract your text by section:

library(rvest)
library(tidyverse)  

pg <- read_html("https://narodne-novine.nn.hr/clanci/sluzbeni/full/2007_07_79_2491.html")

html_nodes(pg, xpath = ".//p[@align='center']/following-sibling::p[@align='justify']") %>% 
  map_df(~{
    data_frame(
      section = html_node(.x, xpath=".//preceding-sibling::p[@align='center'][1]") %>% 
        html_text(trim=TRUE),
      section_text = html_text(.x, trim=TRUE)
    )
  }) 
## # A tibble: 38 x 2
##    section    section_text                                                                                      
##    <chr>      <chr>                                                                                             
##  1 Članak 1.  "U Zakonu o autorskom pravu i srodnim pravima (»Narodne novine«, br. 167/03.) u \r\nčlanku 4. sta…
##  2 Članak 2.  "U članku 8. stavku 2. točki 1. riječ: »standardi« briše se.\r\nU stavku 3. druga rečenica mijenj…
##  3 Članak 3.  "U članku 20. stavku 2. riječi: »na području Republike Hrvatske« zamjenjuju se \r\nriječima: »na …
##  4 Članak 4.  "U članku 32. stavku 5. točki 1. i 3. riječ: »naprava« zamjenjuje se riječju: \r\n»uređaja«.\r\nU…
##  5 Članak 5.  U članku 39. stavku 1. riječi: »stavka 1.« brišu se.                                              
##  6 Članak 6.  "U članku 44. stavku 5. dodaje se rečenica koja glasi:\r\n»U slučaju sumnje, u drugim slučajevima…
##  7 Članak 7.  "U članku 52. stavku 3. riječ: »korištenja« zamjenjuje se riječju: \r\n»iskorištavanja«."         
##  8 Članak 8.  U članku 86. iza riječi: »koji je« dodaje se riječ: »u«.                                          
##  9 Članak 9.  "U članku 98. u stavku 1. riječ: »tehnoloških« zamjenjuje se riječju: \r\n»tehničkih«.\r\nStavak …
## 10 Članak 10. "U članku 109. dodaje se stavak 3. koji glasi:\r\n»(3) Odredbe iz članka 20. ovoga Zakona o iscrp…
## # ... with 28 more rows

You'll need to double check that the above didn't miss anything. Even if it did it should be straightforward to expand upon the answer.

You can get individual lines broken out using the above as well:

html_nodes(pg, xpath = ".//p[@align='center']/following-sibling::p[@align='justify']") %>% 
  map_df(~{
    data_frame(
      section = html_node(.x, xpath=".//preceding-sibling::p[@align='center'][1]") %>% 
        html_text(trim=TRUE),
      section_text = html_text(.x, trim=TRUE)
    )
  }) %>% 
  mutate(section_text = stri_split_lines(section_text)) %>% 
  unnest(section_text)
## # A tibble: 334 x 2
##    section   section_text                                                                     
##    <chr>     <chr>                                                                            
##  1 Članak 1. "U Zakonu o autorskom pravu i srodnim pravima (»Narodne novine«, br. 167/03.) u "
##  2 Članak 1. članku 4. stavak 2. mijenja se i glasi:                                          
##  3 Članak 1. "»(2) Odredbe iz ovoga Zakona o definicijama pojedinih autorskih imovinskih "    
##  4 Članak 1. "prava, o pravu na naknadu za reproduciranje autorskog djela za privatno ili "   
##  5 Članak 1. "drugo vlastito korištenje, o pravu na naknadu za javnu posudbu, kao i o "       
##  6 Članak 1. "iscrpljenju prava distribucije, iznimkama i ograničenjima autorskih prava, "    
##  7 Članak 1. "početku tijeka i učincima isteka rokova trajanja autorskog prava, autorskom "   
##  8 Članak 1. "pravu u pravnom prometu te o odnosu autorskog prava i prava vlasništva "        
##  9 Članak 1. "primjenjuju se na odgovarajući način i za srodna prava, ako za njih nije što "  
## 10 Članak 1. posebno određeno ili ne proizlazi iz njihove pravne naravi.«                     
## # ... with 324 more rows

The tidytext package has examples of how to perform further cleanup transformations to facilitate text mining.