使用rvest

时间:2017-12-15 11:06:57

标签: r rvest

我试图用rvest刮掉一些网站内容。对于此示例,我想抓取此网站的内容:“https://www.filmtotaal.nl/recensie/6693”。我要找的内容是:“Damascus,Syrië...... te zijn。”

我打开了开发人员,看看文本周围的div标记在哪个部分:

div id="adf-autonative"

所以我试过了:

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

然而,这给了我:“1”。

我也尝试过编译xpath:

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")

但是,也没有给出文字。关于我哪里出错以及我应该考虑哪些最佳实践(xpath vs其他方法)的任何想法?

2 个答案:

答案 0 :(得分:0)

使用Google Chrome中的Inspect工具,我们可以看到文字全部嵌套在标记<div class="text">下。不幸的是,主要是存储在子节点之外。

你可以尝试 over - 首先选择并从那里修剪:

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

以下按节点拆分直接子文本以便于提取;请注意,//必须包含分别提取斜体粗体文本的子节点<em><strong>

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] ""

有了这个,以下内容将获得您想要的文本。但是,最终的正则表达式可能不会完全强大到您可能最终拼写的所有页面,因此可能需要进一步修补:

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."

答案 1 :(得分:0)

如果我们愿意超越rvest,我们可能会以几乎完全干净的文字获得可重复的定位。我通过几个URL运行它并且它相当不错(网站的格式不一致)。

你需要一个免费的API key这个方法,但它在删除残障方面做得很棒:

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."