找不到用于网络抓取的正确 CSS 选择器
Cannot find the correct CSS selector for webscraping
我正在尝试从 IMDb 中抓取一些电视收视率,但无法找到正确的 CSS 选择器。我尝试了数十种替代方法,并尝试使用 CSS 选择器小工具,但 R 返回的是 {xml_nodeset (0)}
值。
这是我的代码:
require(rvest)
read_html('https://www.imdb.com/title/tt0562992/?ref_=ttep_ep1') %>%
html_nodes('a.ipc-button ipc-button--single-padding ipc-button--center-align-content ipc-button--default-height ipc-button--core-baseAlt ipc-button--theme-baseAlt ipc-button--on-textPrimary ipc-text-button RatingBarButtonBase__Button-sc-15v8ssr-2 jjcqHZ')
我想做的是提取页面左上角评级中嵌入的 href。请参见下图,我在开发人员视图中突出显示了我要提取的 href CSS。
谁能帮我找出正确的选择器?
我认为这个问题是因为某些 类 末尾的 ID,例如“jjcqHZ”、“15v8ssr”。
许多前端框架每次刷新都会更改这些 ID。
尝试 select 没有这些 类 的元素。
我实际上会使用 XPath,因为 类 在这种情况下非常动态且不太可靠。
<div>foobar</div>
function getElementByXpath(path) {
return document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
}
console.log(getElementByXpath("//html[1]/body[1]/div[1]") );
你可以使用 xpath -
library(rvest)
url <- 'https://www.imdb.com/title/tt0562992/?ref_=ttep_ep1'
url %>%
read_html() %>%
html_element(xpath = '//*[@aria-label="View User Ratings"]') %>%
#For older version of rvest use `html_node`
#html_node(xpath = '//*[@aria-label="View User Ratings"]') %>%
html_attr('href') %>%
paste0('https://www.imdb.com', .)
#[1] "https://www.imdb.com/title/tt0562992/ratings/?ref_=tt_ov_rt"
不妨完成一组建议。
您无需担心动态 classes。使用多值 class 中的稳定 class 作为父项,然后子项组合得到子项 a
标签:
library(rvest)
library(magrittr)
url <- "https://www.imdb.com/title/tt0562992/?ref_=ttep_ep1"
link <- read_html(url) %>%
html_element(".rating-bar__base-button > a") %>%
html_attr("href") %>%
url_absolute(url)
或者,由于 IMDb 对这些事情采用一致的方法,因此避免发出请求并简单地对 url 的查询字符串部分进行替换。您可以将其封装到评级函数中。
url <- "https://www.imdb.com/title/tt0562992/?ref_=ttep_ep1"
link <- gsub("(\?ref_=.*)", "ratings/?ref_=tt_ov_rt", url)
我正在尝试从 IMDb 中抓取一些电视收视率,但无法找到正确的 CSS 选择器。我尝试了数十种替代方法,并尝试使用 CSS 选择器小工具,但 R 返回的是 {xml_nodeset (0)}
值。
这是我的代码:
require(rvest)
read_html('https://www.imdb.com/title/tt0562992/?ref_=ttep_ep1') %>%
html_nodes('a.ipc-button ipc-button--single-padding ipc-button--center-align-content ipc-button--default-height ipc-button--core-baseAlt ipc-button--theme-baseAlt ipc-button--on-textPrimary ipc-text-button RatingBarButtonBase__Button-sc-15v8ssr-2 jjcqHZ')
我想做的是提取页面左上角评级中嵌入的 href。请参见下图,我在开发人员视图中突出显示了我要提取的 href CSS。
谁能帮我找出正确的选择器?
我认为这个问题是因为某些 类 末尾的 ID,例如“jjcqHZ”、“15v8ssr”。 许多前端框架每次刷新都会更改这些 ID。 尝试 select 没有这些 类 的元素。
我实际上会使用 XPath,因为 类 在这种情况下非常动态且不太可靠。
<div>foobar</div>
function getElementByXpath(path) {
return document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
}
console.log(getElementByXpath("//html[1]/body[1]/div[1]") );
你可以使用 xpath -
library(rvest)
url <- 'https://www.imdb.com/title/tt0562992/?ref_=ttep_ep1'
url %>%
read_html() %>%
html_element(xpath = '//*[@aria-label="View User Ratings"]') %>%
#For older version of rvest use `html_node`
#html_node(xpath = '//*[@aria-label="View User Ratings"]') %>%
html_attr('href') %>%
paste0('https://www.imdb.com', .)
#[1] "https://www.imdb.com/title/tt0562992/ratings/?ref_=tt_ov_rt"
不妨完成一组建议。
您无需担心动态 classes。使用多值 class 中的稳定 class 作为父项,然后子项组合得到子项 a
标签:
library(rvest)
library(magrittr)
url <- "https://www.imdb.com/title/tt0562992/?ref_=ttep_ep1"
link <- read_html(url) %>%
html_element(".rating-bar__base-button > a") %>%
html_attr("href") %>%
url_absolute(url)
或者,由于 IMDb 对这些事情采用一致的方法,因此避免发出请求并简单地对 url 的查询字符串部分进行替换。您可以将其封装到评级函数中。
url <- "https://www.imdb.com/title/tt0562992/?ref_=ttep_ep1"
link <- gsub("(\?ref_=.*)", "ratings/?ref_=tt_ov_rt", url)