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

时间:2021-06-24 07:55:18

标签: r web-scraping rvest

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

List I want to scrape

在 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)
}

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

感谢您的帮助! :)

2 个答案:

答案 0 :(得分:2)

您还可以使用返回给定搜索词的函数(注意我必须使用 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)
}

答案 1 :(得分:0)

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

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