使用 RVEST 进行 R Web 抓取:DT 和 DD 标签

R Web Scraping with RVEST: DT and DD Tag

我正在抓取一个汽车网站的数据 (Example link)。 从现在开始一切正常,但我在获取一个特定值时遇到了问题。在图片下方,您会看到一个列表,我想在其中获取“Anzahl Türen”的值(代表一辆车的门数)。

在 HTML 中,“Anzahl”看起来像这样:

<dt>Anzahl Türen</dt>
<dd>3</dd>

如何在此处获取值“3”?

为了从此列表中获取其他值,我已经绕过了使用 HTML 标签“dt”和“dd”的方法,例如使用以下函数获取“Außenfarbe”的值(颜色):

get_color = function(links) {
     car_page = read_html(links)
     col = car_page %>% html_nodes("dd a") %>%
        html_text()
     colors = c("Blau","Rot","Schwarz","Silber", "Beige", "Braun","Bronze","Gelb","Grau", 
                "Grün","Violett","Weiß","Orange","Gold")
     intersect(col, colors)
}

但是现在我想要的值是一个数字,不再是文本,所以这个函数对另一行不起作用。

感谢您的帮助! :)

您实际上可以提取数据框中的所有值,然后select您想要的值。

library(rvest)
url <- 'https://www.autoscout24.de/angebote/volkswagen-lupo-1-2-tdi-3l-diesel-gruen-b5ee4316-b672-490a-917d-6732bb6065a6?&cldtidx=20&cldtsrc=listPage&searchId=603681428'
car_page = read_html(url)

data <- tibble::tibble(name = car_page %>% html_nodes("dt") %>% html_text(), 
               value = car_page %>% html_nodes("dd") %>% html_text() %>% trimws)

# A tibble: 22 x 2
#   name                            value      
#   <chr>                           <chr>      
# 1 Zustand                         Gebraucht  
# 2 HU Prüfung                      04/2023    
# 3 Letzter Kundendienst            03/2021    
# 4 Letzter Wechsel des Zahnriemens 05/2015    
# 5 Marke                           Volkswagen 
# 6 Modell                          Lupo       
# 7 Erstzulassung                   2000       
# 8 Außenfarbe                      Grün       
# 9 Innenausstattung                Stoff, Grün
#10 Karosserieform                  Kleinwagen 
# … with 12 more rows

data$value[data$name == "Anzahl Türen"]
#[1] "3"

正在另一个 url -

上测试
url <- 'https://www.autoscout24.de/angebote/peugeot-206-110-tendance-tuev-neu-1-6-109ps-4-5tuetig-benzin-blau-cd721b01-494f-47cc-aead-c3c41d728935?ipc=recommendation&ipl=detailpage-engine-itemBased'

data$value[data$name == "Anzahl Türen"]
#[1] "5"

您还可以使用一个函数 returns 用于给定的搜索词(注意我必须使用 iconv 来处理一些 mojibake)

library(rvest)
library(magrittr)

page <- read_html('https://www.autoscout24.de/angebote/volkswagen-lupo-1-2-tdi-3l-diesel-gruen-b5ee4316-b672-490a-917d-6732bb6065a6?&cldtidx=20&cldtsrc=listPage&searchId=603681428')

get_value <-function(html, search_term){
  page %>% 
    html_node(xpath = sprintf("//dt[text()[contains(.,'%s')]]/following-sibling::dd[1]",  
                              iconv(c(search_term), from = 'iso_8859-15', to = 'utf-8'))) %>% 
    html_text(trim = T) -> value
    return(value)
}

get_value(page, 'Anzahl Türen') %>% as.integer()
get_value(page, 'Außenfarbe')

以上是包含匹配项。完全匹配将使用:

get_value <-function(html, search_term){
  page %>% 
    html_node(xpath = sprintf("//dt[text()='%s']/following-sibling::dd[1]",  
                              iconv(c(search_term), from = 'iso_8859-15', to = 'utf-8'))) %>% 
    html_text(trim = T) -> value
    return(value)
}