在 html table 中查找包含特定图标的单元格
Find cell in html table containing a specific icon
我正在寻找可以告诉我特定图标位于 html table 的哪个单元格中的代码。
这是我正在处理的内容:
u <- "http://www.transfermarkt.nl/lionel-messi/leistungsdaten/spieler/28003/saison/2014/plus/1"
doc <- rvest::html(u)
tab <- rvest::html_table(doc, fill = TRUE)[[6]]
"Pos." 列指定球员在场上的位置。其中一些有一个额外的图标。我可以在页面上看到这些图标的存在,如下所示:
rvest::html_nodes(doc, ".kapitaenicon-table")
但这并没有告诉我它们在哪里。我希望我的代码 return 该图标出现在 table 中 "Pos. column" 的第 2、10、11、27 行。我该怎么做?
多一点 rvest
和 XPath 魔术可以让您获得索引:
library(rvest)
library(magrittr)
library(XML)
pg <- html("http://www.transfermarkt.nl/lionel-messi/leistungsdaten/spieler/28003/saison/2014/plus/1")
pg %>%
html_nodes("table") %>%
extract2(6) %>%
html_nodes("tbody > tr") %>%
sapply(function(x) {
length(xpathSApply(x, "./td[8]/span[@class='kapitaenicon-table icons_sprite']")) == 1
}) %>% which
## [1] 2 10 11 27
得到第 6 个 table,提取 tr
,然后通过它们查找第 8 个 td
,其中包含正确的 span
/class
它。如果 XPath 搜索失败,它 returns 一个空列表,因此您可以使用长度来确定哪些行有 td
和其中的图标,哪些没有。
这个:
pg %>%
html_nodes(xpath="//table[6]/tbody/tr/td[8]") %>%
xmlSApply(xpathApply, "boolean(./span[@class='kapitaenicon-table icons_sprite'])") %>%
which
也有效,而且更紧(更快)。它使用 XPath boolean
操作来测试是否存在。如果您没有其他操作要在节点上执行,这会更方便。
这是一个 xml2
版本,尽管我不得不相信在 xml2
中必须有更好的方法来做到这一点:
library(xml2)
library(magrittr)
pg2 <- read_html("http://www.transfermarkt.nl/lionel-messi/leistungsdaten/spieler/28003/saison/2014/plus/1")
pg2 %>%
xml_find_all("//table[6]/tbody/tr/td[8]") %>%
as_list %>%
sapply(function(x) {
inherits(try(xml_find_one(x, "./span"), silent=TRUE), "xml_node")
}) %>% which
更新
对于 xml2
的 0.1.0.9000
版本,我必须执行以下操作:
pg2 %>% xml_find_all("//table") %>%
as_list %>%
extract2(6) %>%
xml_find_all("./tbody/tr/td[8]") %>%
as_list %>%
sapply(function(x) {
inherits(try(xml_find_one(x, "./span"), silent=TRUE), "xml_node")
}) %>% which
不应该是这样,我 filed a bug report.
Session info -------------------------------------------------------------------------
setting value
version R version 3.2.0 (2015-04-16)
system x86_64, darwin13.4.0
ui RStudio (0.99.441)
language (EN)
collate en_US.UTF-8
tz America/New_York
Packages -----------------------------------------------------------------------------
package * version date source
curl * 0.5 2015-02-01 CRAN (R 3.2.0)
devtools * 1.7.0 2015-01-17 CRAN (R 3.2.0)
magrittr 1.5 2014-11-22 CRAN (R 3.2.0)
Rcpp * 0.11.5 2015-03-06 CRAN (R 3.2.0)
rstudioapi * 0.3.1 2015-04-07 CRAN (R 3.2.0)
xml2 0.1.0 2015-04-20 CRAN (R 3.2.0)
我正在寻找可以告诉我特定图标位于 html table 的哪个单元格中的代码。 这是我正在处理的内容:
u <- "http://www.transfermarkt.nl/lionel-messi/leistungsdaten/spieler/28003/saison/2014/plus/1"
doc <- rvest::html(u)
tab <- rvest::html_table(doc, fill = TRUE)[[6]]
"Pos." 列指定球员在场上的位置。其中一些有一个额外的图标。我可以在页面上看到这些图标的存在,如下所示:
rvest::html_nodes(doc, ".kapitaenicon-table")
但这并没有告诉我它们在哪里。我希望我的代码 return 该图标出现在 table 中 "Pos. column" 的第 2、10、11、27 行。我该怎么做?
多一点 rvest
和 XPath 魔术可以让您获得索引:
library(rvest)
library(magrittr)
library(XML)
pg <- html("http://www.transfermarkt.nl/lionel-messi/leistungsdaten/spieler/28003/saison/2014/plus/1")
pg %>%
html_nodes("table") %>%
extract2(6) %>%
html_nodes("tbody > tr") %>%
sapply(function(x) {
length(xpathSApply(x, "./td[8]/span[@class='kapitaenicon-table icons_sprite']")) == 1
}) %>% which
## [1] 2 10 11 27
得到第 6 个 table,提取 tr
,然后通过它们查找第 8 个 td
,其中包含正确的 span
/class
它。如果 XPath 搜索失败,它 returns 一个空列表,因此您可以使用长度来确定哪些行有 td
和其中的图标,哪些没有。
这个:
pg %>%
html_nodes(xpath="//table[6]/tbody/tr/td[8]") %>%
xmlSApply(xpathApply, "boolean(./span[@class='kapitaenicon-table icons_sprite'])") %>%
which
也有效,而且更紧(更快)。它使用 XPath boolean
操作来测试是否存在。如果您没有其他操作要在节点上执行,这会更方便。
这是一个 xml2
版本,尽管我不得不相信在 xml2
中必须有更好的方法来做到这一点:
library(xml2)
library(magrittr)
pg2 <- read_html("http://www.transfermarkt.nl/lionel-messi/leistungsdaten/spieler/28003/saison/2014/plus/1")
pg2 %>%
xml_find_all("//table[6]/tbody/tr/td[8]") %>%
as_list %>%
sapply(function(x) {
inherits(try(xml_find_one(x, "./span"), silent=TRUE), "xml_node")
}) %>% which
更新
对于 xml2
的 0.1.0.9000
版本,我必须执行以下操作:
pg2 %>% xml_find_all("//table") %>%
as_list %>%
extract2(6) %>%
xml_find_all("./tbody/tr/td[8]") %>%
as_list %>%
sapply(function(x) {
inherits(try(xml_find_one(x, "./span"), silent=TRUE), "xml_node")
}) %>% which
不应该是这样,我 filed a bug report.
Session info -------------------------------------------------------------------------
setting value
version R version 3.2.0 (2015-04-16)
system x86_64, darwin13.4.0
ui RStudio (0.99.441)
language (EN)
collate en_US.UTF-8
tz America/New_York
Packages -----------------------------------------------------------------------------
package * version date source
curl * 0.5 2015-02-01 CRAN (R 3.2.0)
devtools * 1.7.0 2015-01-17 CRAN (R 3.2.0)
magrittr 1.5 2014-11-22 CRAN (R 3.2.0)
Rcpp * 0.11.5 2015-03-06 CRAN (R 3.2.0)
rstudioapi * 0.3.1 2015-04-07 CRAN (R 3.2.0)
xml2 0.1.0 2015-04-20 CRAN (R 3.2.0)