gpt4 book ai didi

xml - 为 "Periodic table"和所有链接抓取 wiki 页面

转载 作者:数据小太阳 更新时间:2023-10-29 01:44:16 24 4
gpt4 key购买 nike

我想抓取以下维基文章:http://en.wikipedia.org/wiki/Periodic_table

这样我的 R 代码的输出将是一个包含以下列的表格:

  • 化学元素简称
  • 化学元素全名
  • 化学元素 wiki 页面的 URL

(显然每个化学元素都有一行)

我正在尝试使用 XML 包获取页面内的值,但似乎卡在了开头,所以我希望能提供有关如何操作的示例(和/或相关示例的链接)

library(XML)
base_url<-"http://en.wikipedia.org/wiki/Periodic_table"
base_html<-getURLContent(base_url)[[1]]
parsed_html <- htmlTreeParse(base_html, useInternalNodes = TRUE)
xmlChildren(parsed_html)
getNodeSet(parsed_html, "//html", c(x = base_url))
[[1]]
attr(,"class")
[1] "XMLNodeSet"

最佳答案

试试这个:

library(XML)

URL <- "http://en.wikipedia.org/wiki/Periodic_table"
root <- htmlTreeParse(URL, useInternalNodes = TRUE)

# extract attributes and value of all 'a' tags within 3rd table
f <- function(x) c(xmlAttrs(x), xmlValue(x))
m1 <- xpathApply(root, "//table[3]//a", f)
m2 <- suppressWarnings(do.call(rbind, m1))

# extract rows that correspond to chemical symbols
ix <- grep("^[[:upper:]][[:lower:]]{0,2}", m2[, "class"])

m3 <- m2[ix, 1:3]
colnames(m3) <- c("URL", "Name", "Symbol")
m3[,1] <- sub("^", "http://en.wikipedia.org", m3[,1])
m3[,2] <- sub(" .*", "", m3[,2])

一些输出:

> dim(m3)
[1] 118 3
> head(m3)
URL Name Symbol
[1,] "http://en.wikipedia.org/wiki/Hydrogen" "Hydrogen" "H"
[2,] "http://en.wikipedia.org/wiki/Helium" "Helium" "He"
[3,] "http://en.wikipedia.org/wiki/Lithium" "Lithium" "Li"
[4,] "http://en.wikipedia.org/wiki/Beryllium" "Beryllium" "Be"
[5,] "http://en.wikipedia.org/wiki/Boron" "Boron" "B"
[6,] "http://en.wikipedia.org/wiki/Carbon" "Carbon" "C"

我们可以通过从 Jeffrey 的 xpath 表达式开始进一步增强 xpath 表达式(因为它几乎获得顶部的元素)并向它添加一个限定条件来使它更紧凑。在这种情况下,可以使用 xpathSApply 来消除对 do.call 或 plyr 包的需要。我们解决零碎问题的最后一点与以前相同。这会生成一个矩阵而不是数据框,这似乎更可取,因为内容完全是字符。

library(XML)

URL <- "http://en.wikipedia.org/wiki/Periodic_table"
root <- htmlTreeParse(URL, useInternalNodes = TRUE)

# extract attributes and value of all a tags within 3rd table
f <- function(x) c(xmlAttrs(x), xmlValue(x))
M <- t(xpathSApply(root, "//table[3]/tr/td/a[.!='']", f))[1:118,]

# nicer column names, fix up URLs, fix up Mercury.
colnames(M) <- c("URL", "Name", "Symbol")
M[,1] <- sub("^", "http://en.wikipedia.org", M[,1])
M[,2] <- sub(" .*", "", M[,2])

View(M)

关于xml - 为 "Periodic table"和所有链接抓取 wiki 页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4393780/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com