使用 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)
}
我正在抓取一个汽车网站的数据 (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)
}