2017-12-15 4 views
1

Im Versuch, einige Website-Inhalt mit Rvest zu kratzen. Für dieses Beispiel möchte ich den Inhalt dieser Seite scrappen: "https://www.filmtotaal.nl/recensie/6693". Der Inhalt, nach dem ich suche, ist: "Damaskus, Syrië ... te zijn."Abrufen von Webdaten mit Hilfe von

Ich öffnete Entwickler, in dem sehen Abschnitt, der die div den Text umgibt, wird markiert durch:

div id="adf-autonative" 

So also habe ich versucht:

read_html("https://www.filmtotaal.nl/recensie/6693") %>% 
html_nodes(xpath = '//*[@id="adf-autonative"]') %>% 
xml_attr("value") 

Das aber gibt mir: "1" .

Ich habe auch versucht die XPath compying:

xpath <- '/html/body/div[4]/div[1]/div/article/div/div/div[2]/strong[5]' 

read_html("https://www.filmtotaal.nl/recensie/6693") %>% 
    html_nodes(xpath = xpath) %>% 
    xml_attr("value") 

jedoch nicht geben auch den Text nicht. Irgendwelche Gedanken darüber, wo ich falsch liege und was ich als Best Practice betrachten sollte (xpath vs. anderer Ansatz)?

+0

Sie haben [eine API] (http://api.filmtotaal.nl/) – hrbrmstr

Antwort

0

Verwenden Sie das Tool Inspect in Google Chrome, können wir sehen, dass der Text unter dem Tag <div class="text"> verschachtelt ist. Leider ist es meist außerhalb von Kindknoten gespeichert.

Sie könnten versuchen, und über -Restaurant ersten und trimmen von dort:

pg = read_html('https://www.filmtotaal.nl/recensie/6693') 
pg %>% html_nodes('div.text') %>% html_text %>% trimws 
# [1] "Regie: [...] |Jaar: 20171Damascus, Syrië.[...] te zijn." 

Die folgenden Splits aus direkt untergeordneten Text durch den Knoten für eine einfachere Extraktion; Beachten Sie, dass // erforderlich ist, um die Unterknoten <em> und <strong>, die italicized und bolded Text jeweils enthalten.

pg %>% html_nodes(xpath = '//div[@class="text"]//text()') %>% html_text %>% trimws 

# [1] ""                                                                                                                                                                                         
# [2] ""                                                                                                                                                                                         
# [3] ""                                                                                                                                                                                         
# [4] ""                                                                                                                                                                                         
# [5] ""                                                                                                                                                                                         
# [6] ""                                                                                                                                                                                         
# [7] ""                                                                                                                                                                                         
# [8] ""                                                                                                                                                                                         
# [9] ""                                                                                                                                                                                         
# [10] ""                                                                                                                                                                                         
# [11] ""                                                                                                                                                                                         
# [12] "Regie:"                                                                                                                                                                                        
# [13] "Philippe van Leeuw |"                                                                                                                                                                                    
# [14] "Cast:"                                                                                                                                                                                        
# [15] "Hiam Abbass (Oum Yazan), Diamand Bou Abboud (Halima), Juliette Navis (Delhani), Mohsen Abbas (Abou Monzer) e.a. |"                                                                                                                                                             
# [16] "Speelduur:"                                                                                                                                                                                       
# [17] "85 minuten |"                                                                                                                                                                                      
# [18] "Jaar:"                                                                                                                                                                                        
# [19] "2017"                                                                                                                                                                                        
# [20] "1"                                                                                                                                                                                         
# [21] "Damascus, Syrië. Vanuit zijn woonkamerraam kijkt een oudere man uit op de parkeerplaats van zijn appartementencomplex terwijl hij een sigaretje rookt. Een groepje mannen verzamelt zich enkele tientallen meters van het gebouw, tot uit het niets een kogel vlak bij hun voeten de grond raakt. Hij kijkt met lede ogen toe hoe de mannen beneden vluchten voor hun leven, en sjokt vervolgens terug naar zijn bank. Daar blijft hij enige tijd met zijn handen aan het hoofd zitten terwijl hij ontredderd voor zich uit staart. Op de salontafel ligt een stapel halflege sigarettendoosjes. De man raapt er eentje op en steekt nog een sigaret op. Wat kan hij anders doen?"                     
# [22] ""                                                                                                                                                                                         
# [23] "De openingsscène van"                                                                                                                                                                                    
# [24] "Insyriated"                                                                                                                                                                                       
# [25] ", de tweede film van de Belgische regisseur Philippe van Leeuw, schetst in één opslag het gevoel van wanhoop en claustrofobie van de situatie waarin de personages zich bevinden. Terwijl de Syrische burgeroorlog buiten volop aan de gang is, zit een familie, samen met een aantal huisgasten en een huishoudster al dagen, zo niet weken opgesloten in een klein appartement. Het gebouw verlaten is onveilig, aangezien hun woning omringd is door sluipschutters. Dit vraagt om drastische maatregelen, van een driedubbel slot op de deur en het rantsoeneren van water en voedsel, tot het eens in de zoveel tijd verschuilen onder de keukentafel wanneer er nabij een bom tot ontploffing komt."               
# [26] "In de afwezigheid van haar man, die zich nog ergens buitenshuis bevindt, doet de moeder des huizes haar uiterste best om het leven in het appartement zo normaal mogelijk te laten verlopen. Al haar goede bedoelingen ten spijt, wordt het haar behoorlijk lastig gemaakt door een ingrijpende gebeurtenis die al vroeg in de film plaatsvindt. Alleen de moeder en de huishoudster zijn hier getuige van, en besluiten een groot geheim te bewaren voor de rest van de bewoners. Dat blijkt echter een stuk minder eenvoudig wanneer je in een grote groep op elkaars lip zit, waardoor al gauw een gevoel van onderling wantrouwen en spanning wordt gecreëerd."                        
# [27] "Daarmee zijn er in Van Leeuws film voortdurend twee spanningsbogen aan het werk. Enerzijds is er in de achtergrond de aanhoudende dreiging van de burgeroorlog. Hoewel al het geweld bijna de gehele film buiten aan de gang is, fungeert het veelal aanwezige geknal van geweerschoten en bommen als een constante herinnering dat de bewoners hun leven niet zeker zijn. Het enge is dat al die oorlogsgeluiden na verloop van tijd bijna normaal begint te worden, als een soort geaccepteerde ruis op de achtergrond, totdat er eens een ontploffing klinkt die net te dichtbij huis is. Tegelijkertijd staat er binnenshuis ook een figuurlijke bom op barsten, met het geheim waarvan alleen de moeder des huizes, de huishoudster en de kijker weet hebben." 
# [28] "Zo houdt Van Leeuw de gemoederen lange tijd goed bezig, dankzij de interessante dynamiek tussen zijn personages, die door de dreiging van binnen- en buitenaf spannend blijft. Lange tijd is afwachten welke bom als eerste zal barsten, totdat in de laatste akte de echte confrontatie zich pas ontpopt. Hierin neemt het verhaal plotseling een heel donkere en akelige wending, die ook voor de kijker maar moeilijk te doorstaan is. Het maakt"                                                                            
# [29] "Insyriated"                                                                                                                                                                                       
# [30] "tot een zeer beklemmende en oncomfortabele zit. Precies zoals een oorlogsfilm eigenlijk hoort te zijn."                                                                                                                                                                
# [31] ""                                                                                                                                                                                         
# [32] ""                                                                                                                                                                                         
# [33] ""                                                                                                                                                                                         
# [34] ""                                                                                                                                                                                         
# [35] ""                                                                                                                                                                                         
# [36] ""                                                                                                                                                                                         
# [37] "" 

Mit diesem in der Hand wird das folgende den Text erhalten, den Sie wollen. Aber die endgültige regex möglicherweise nicht vollständig robust zu allen Seiten, die Sie kratzen können am Ende, so kann ferner Bastelei erfordern:

pg %>% html_nodes(xpath = '//div[@class="text"]//text()') %>% 
    html_text %>% trimws %>% 
    # Upon splitting, the earlier text appears to 
    # be characterized by 
    # (1) 'Field:' pattern from <strong> nodes 
    # (2) 'value |' pattern following <strong> nodes 
    # (3) 'YYYY' year for the final Field 
    # (4) random whitespace 
    # (1), (2), and (3/4) are the parts of this regex; 
    # * instead of + here captures empty rows 
    grep('^[a-zA-Z]+:|\\|$|^[0-9]*$', ., 
     invert = TRUE, value = TRUE) %>% 
    paste(collapse = ' ') 
# [1] "Damascus, Syrië. [...] te zijn." 
0

Wenn wir bereit sind, ein wenig über rvest gehen können wir wahrscheinlich wiederholbar bekommen Targeting mit fast perfekt sauberer Text. Ich habe es durch ein paar URLs und es ist ziemlich anständig (die Website ist inkonsistent in ihrer Formatierung).

Sie benötigen eine kostenlose API key für diese Methode, aber es hat einen fantastischen Job zu entfernen cruft:

library(hgr) # devtools::install_github("hrbrmstr/hgr") AND signup for a free API key 
library(rvest) 
library(htmltidy) 
library(stringi) 
library(tidyverse) 

review_ids <- c("6693", "1286", "12305", "10594") 

get_review_text <- function(id) { 

    jtf <- hgr::just_the_facts(sprintf("https://www.filmtotaal.nl/recensie/%s", id)) 

    tidy_html(jtf$content) %>% 
    read_html() %>% 
    html_text() %>% 
    stri_trim_both() %>% 
    discard(`==`, "") %>% 
    paste0(collapse="\n") 

} 

reviews_df <- map_chr(review_ids, get_review_text) 

rdf[1] 
## [1] "1\nDamascus, Syrië. Vanuit zijn woonkamerraam kijkt een oudere man uit op de\nparkeerplaats van zijn appartementencomplex terwijl hij een sigaretje\nrookt. Een groepje mannen verzamelt zich enkele tientallen meters van het\ngebouw, tot uit het niets een kogel vlak bij hun voeten de grond raakt. Hij\nkijkt met lede ogen toe hoe de mannen beneden vluchten voor hun leven, en\nsjokt vervolgens terug naar zijn bank. Daar blijft hij enige tijd met zijn\nhanden aan het hoofd zitten terwijl hij ontredderd voor zich uit staart. Op\nde salontafel ligt een stapel halflege sigarettendoosjes. De man raapt er\neentje op en steekt nog een sigaret op. Wat kan hij anders doen?\nDe openingsscène van Insyriated, de tweede film van de Belgische regisseur\nPhilippe van Leeuw, schetst in één opslag het gevoel van wanhoop en\nclaustrofobie van de situatie waarin de personages zich bevinden. Terwijl\nde Syrische burgeroorlog buiten volop aan de gang is, zit een familie,\nsamen met een aantal huisgasten en een huishoudster al dagen, zo niet weken\nopgesloten in een klein appartement. Het gebouw verlaten is onveilig,\naangezien hun woning omringd is door sluipschutters. Dit vraagt om\ndrastische maatregelen, van een driedubbel slot op de deur en het\nrantsoeneren van water en voedsel, tot het eens in de zoveel tijd\nverschuilen onder de keukentafel wanneer er nabij een bom tot ontploffing\nkomt.\nIn de afwezigheid van haar man, die zich nog ergens buitenshuis bevindt,\ndoet de moeder des huizes haar uiterste best om het leven in het\nappartement zo normaal mogelijk te laten verlopen. Al haar goede\nbedoelingen ten spijt, wordt het haar behoorlijk lastig gemaakt door een\ningrijpende gebeurtenis die al vroeg in de film plaatsvindt. Alleen de\nmoeder en de huishoudster zijn hier getuige van, en besluiten een groot\ngeheim te bewaren voor de rest van de bewoners. Dat blijkt echter een stuk\nminder eenvoudig wanneer je in een grote groep op elkaars lip zit, waardoor\nal gauw een gevoel van onderling wantrouwen en spanning wordt gecreëerd.\nDaarmee zijn er in Van Leeuws film voortdurend twee spanningsbogen aan het\nwerk. Enerzijds is er in de achtergrond de aanhoudende dreiging van de\nburgeroorlog. Hoewel al het geweld bijna de gehele film buiten aan de gang\nis, fungeert het veelal aanwezige geknal van geweerschoten en bommen als\neen constante herinnering dat de bewoners hun leven niet zeker zijn. Het\nenge is dat al die oorlogsgeluiden na verloop van tijd bijna normaal begint\nte worden, als een soort geaccepteerde ruis op de achtergrond, totdat er\neens een ontploffing klinkt die net te dichtbij huis is. Tegelijkertijd\nstaat er binnenshuis ook een figuurlijke bom op barsten, met het geheim\nwaarvan alleen de moeder des huizes, de huishoudster en de kijker weet\nhebben.\nZo houdt Van Leeuw de gemoederen lange tijd goed bezig, dankzij de\ninteressante dynamiek tussen zijn personages, die door de dreiging van\nbinnen- en buitenaf spannend blijft. Lange tijd is afwachten welke bom als\neerste zal barsten, totdat in de laatste akte de echte confrontatie zich\npas ontpopt. Hierin neemt het verhaal plotseling een heel donkere en\nakelige wending, die ook voor de kijker maar moeilijk te doorstaan is. Het\nmaakt Insyriated tot een zeer beklemmende en oncomfortabele zit. Precies\nzoals een oorlogsfilm eigenlijk hoort te zijn." 
Verwandte Themen