【问题标题】:Scraping content from urls in dataframe using R使用 R 从数据框中的 url 中抓取内容
【发布时间】:2021-04-02 11:15:14
【问题描述】:

抱歉,我对 R 比较陌生,还不太了解它。我还看到类似的问题被问得更频繁。但是,相应的解决方案对我不起作用(或者 - 更有可能 - 我没有让它们起作用)。 我想从报纸上抓取内容。因此,第一步,我需要从一个 url 中抓取所有文章和相应的 url。效果很好

Abendblatt <- read_html("https://www.abendblatt.de/archiv/nachrichten-vom-3-3-2016")
headline_ <- Abendblatt %>% 
  html_nodes(".teaser__headline") %>%
  html_text()
url_ <- Abendblatt %>% 
  html_nodes("article") %>%
  html_nodes("a") %>%
  html_attr("href")
df_urls <- data.frame(headline = headline_, url = url_)

现在我有了所有文章的网址。 接下来,我想从文章中抓取特定的内容。对于一个也可以正常工作的网址

Abendblatt_Article <- read_html("https://www.abendblatt.de/vermischtes/article227980833/Tatort-Muenster-Friederike-Kempter-hoert-als-Ermittlerin-auf.html")


header_ <- Abendblatt_Article %>% 
html_nodes(".article__header__headline") %>%
  html_text() %>%
  paste(., collapse = "")
intro_ <- Abendblatt_Article %>% 
  html_nodes(".article__header__intro__text") %>%
  html_text() %>%
  paste(., collapse = "")

text_ <- Abendblatt_Article %>% 
  html_nodes("p") %>%
  html_text() %>%
  paste(., collapse = "")
  
df <- data.frame(heading = header_, intro = intro_, text = text_)

但是,我想从数据框 df_urls 中遍历 url_ 中的所有 url。

谁能帮我解决这个问题?

非常感谢

詹斯

【问题讨论】:

    标签: r url web-scraping rvest


    【解决方案1】:

    你可以试试这个:

    library(rvest)
    
    read_data <- function(url) {
      
      result <- tryCatch({
    
      Abendblatt_Article <- read_html(url)
      
      header_ <- Abendblatt_Article %>% 
        html_nodes(".article__header__headline") %>%
        html_text() %>%
        paste(., collapse = "")
      intro_ <- Abendblatt_Article %>% 
        html_nodes(".article__header__intro__text") %>%
        html_text() %>%
        paste(., collapse = "")
      
      text_ <- Abendblatt_Article %>% 
        html_nodes("p") %>%
        html_text() %>%
        paste(., collapse = "")
      
      data.frame(heading = header_, intro = intro_, text = text_)  
      
      }, error = function(e) data.frame(heading = NA, intro = NA, text = NA))
      
      return(result)
    }
    
    result <- purrr::map_df(df_urls$url, read_data)
    

    【讨论】:

    • 您好 Ronak,感谢您的提示。这似乎是我一直在寻找的。但是,我收到以下错误消息“Fehler in UseMethod("read_xml") : nicht anwendbare Methode für 'read_xml' auf Objekt der Klasse "factor" angewendet" 或英文“Error in UseMethod("read_xml") : Inapplicable method for 'read_xml' 应用于类“因子”的对象。你知道可能是什么问题吗?
    • @JensEger Ronak 的解决方案应该有效。作为 R 的新手,这已经非常先进了。如果该函数适用于单个案例,您可以使用 purrr::map_xxx 朋友来迭代您的数据结构。在向量中加载 url:,即 urls % html_nodes("article") %>% html_nodes("a") %>% html_attr("href")。然后运行 ​​result % purrr::map_df(.f = read_data) 然后检查这个向量是否属于类字符。您应该在 RStudio 的 Global Environment 窗格中看到 urls 向量和 chr [1:200] 的标题...这意味着您有一个包含 200 个元素的字符向量
    • 请注意,如果需要,您可以再次添加到您的结果中,这会删除您的标题。只需关注手头的问题并简化您的vectors/data.frame。我不确定因素来自哪里,但感觉 R 强制文本。因此,为您使用纯 urls-vector 会更安全。维尔格吕克!
    • 感觉就像我犯了一个愚蠢的错误。我的代码的第一部分将 url_ 保存为带有 chr[1:200] 的向量,这应该没问题。然而,第二部分将 Abendblatt_Article 保存为列表。这似乎在单一案例示例中有效,但在循环中无效。您能帮我将 Abendblatt_Article
    • @JensEger 看来您在 R stringsAsFactors = FALSE 创建所有数据框,例如df_urls &lt;- data.frame(headline = headline_, url = url_, stringsAsFactors = FALSE),并将read_data 函数中的最后一次调用更改为data.frame(heading = header_, intro = intro_, text = text_, stringsAsFactors = FALSE),然后再次尝试答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多