Xml 为“元素周期表”和所有链接创建wiki页面
我想删去以下维基文章: 因此,我的R代码的输出将是一个包含以下列的表: 化学元素简称 化学元素全称 化学元素wiki页面的URL 显然,每种化学元素都有一行 我正在尝试使用XML包获取页面中的值,但似乎停留在开始阶段,因此我希望能提供一个关于如何执行的示例和/或相关示例的链接Xml 为“元素周期表”和所有链接创建wiki页面,xml,r,web-scraping,Xml,R,Web Scraping,我想删去以下维基文章: 因此,我的R代码的输出将是一个包含以下列的表: 化学元素简称 化学元素全称 化学元素wiki页面的URL 显然,每种化学元素都有一行 我正在尝试使用XML包获取页面中的值,但似乎停留在开始阶段,因此我希望能提供一个关于如何执行的示例和/或相关示例的链接 library(XML) base_url<-"http://en.wikipedia.org/wiki/Periodic_table" base_html<-getURLContent(base_url)[[
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])
我们可以通过从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)
塔尔-我以为这会很容易。我想告诉您readHTMLTable,这是XML包中我最喜欢的函数。见鬼,它的帮助页面甚至显示了一个抓取维基百科页面的例子 但是,唉,这不是你想要的:
library(XML)
url = 'http://en.wikipedia.org/wiki/Periodic_table'
tables = readHTMLTable(html)
# ... look through the list to find the one you want...
table = tables[3]
table
$`NULL`
Group # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
1 Period <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
2 1 1H 2He <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
3 2 3Li 4Be 5B 6C 7N 8O 9F 10Ne <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
4 3 11Na 12Mg 13Al 14Si 15P 16S 17Cl 18Ar <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
5 4 19K 20Ca 21Sc 22Ti 23V 24Cr 25Mn 26Fe 27Co 28Ni 29Cu 30Zn 31Ga 32Ge 33As 34Se 35Br 36Kr
6 5 37Rb 38Sr 39Y 40Zr 41Nb 42Mo 43Tc 44Ru 45Rh 46Pd 47Ag 48Cd 49In 50Sn 51Sb 52Te 53I 54Xe
7 6 55Cs 56Ba * 72Hf 73Ta 74W 75Re 76Os 77Ir 78Pt 79Au 80Hg 81Tl 82Pb 83Bi 84Po 85At 86Rn
8 7 87Fr 88Ra ** 104Rf 105Db 106Sg 107Bh 108Hs 109Mt 110Ds 111Rg 112Cn 113Uut 114Uuq 115Uup 116Uuh 117Uus 118Uuo
9 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
10 * Lanthanoids 57La 58Ce 59Pr 60Nd 61Pm 62Sm 63Eu 64Gd 65Tb 66Dy 67Ho 68Er 69Tm 70Yb 71Lu <NA> <NA>
11 ** Actinoids 89Ac 90Th 91Pa 92U 93Np 94Pu 95Am 96Cm 97Bk 98Cf 99Es 100Fm 101Md 102No 103Lr <NA> <NA>
你一定要搜刮维基百科吗?您可以对Wikidata运行此SPARQL查询:
很抱歉,如果这不能直接回答您的问题,但这将有助于人们以干净的方式获取相同的信息。您为什么要尝试删除该页面?从别处获取数据,周期系统不会频繁变化。这些联系必须遵循某种模式…如果不是你,塔尔,问这个问题我会非常怀疑,但我知道你的动机一定是纯粹的。该页面是受保护的,因此,即使有方便的工具供R访问特殊的Wiki界面,它们也可能不适用于此。试着转到这一页:语言要点:“scrape”是“scraping”的动词。“废弃”某物意味着把它变成垃圾“报废”得到两个“p”-所以“报废一页”意味着将其变成垃圾,“报废一页”就是从中获取数据!@塔尔:我不知道这会是一个多么好的问题。两个很好的回答!每个wikimedia页面都可以以XML格式而不是HTML格式返回-例如,在这里阅读更多内容:你好,Jeffrey,谢谢你的回答!我喜欢看你是如何实现它的。我还建议您在仔细考虑之后添加doc,因为我最终使用了您的代码片段,所以我决定将V标记移到您的答案中。我希望在这里能更多地见到你——你的回答很好,p.s:当我开始使用readHTMLTable函数时,我也想过要使用它,然后很快发现它的局限性。干杯,非常感谢-很抱歉错过了电话!我也喜欢G.格罗森迪克的回答,但我很欣赏他的观点!你好,格罗森迪克-精彩的答案-竖起两个大拇指,选择一个答案。谢谢你的帮助!最好的情况是,塔利正在讨论选择谁作为答案。另一个答案是杰弗里,他只有18个因果报应点,他也提供了一个可行的答案,所以我决定给他打V分。但是你的回答很有帮助。再次感谢你!最好的是,TalHave在Jeffrey的xpath表达式和我以前的代码的基础上添加了第二个解决方案。@Gabor:我已经对你的第一个回复投了赞成票,所以我所能做的就是对这条进一步的评论投赞成票,并为这条评论和你们所有其他关于rhelp的优秀回复添加额外的书面感谢。我支持DWin的观点——这真是一个伟大的回答!
library(XML)
url = 'http://en.wikipedia.org/wiki/Periodic_table'
tables = readHTMLTable(html)
# ... look through the list to find the one you want...
table = tables[3]
table
$`NULL`
Group # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
1 Period <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
2 1 1H 2He <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
3 2 3Li 4Be 5B 6C 7N 8O 9F 10Ne <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
4 3 11Na 12Mg 13Al 14Si 15P 16S 17Cl 18Ar <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
5 4 19K 20Ca 21Sc 22Ti 23V 24Cr 25Mn 26Fe 27Co 28Ni 29Cu 30Zn 31Ga 32Ge 33As 34Se 35Br 36Kr
6 5 37Rb 38Sr 39Y 40Zr 41Nb 42Mo 43Tc 44Ru 45Rh 46Pd 47Ag 48Cd 49In 50Sn 51Sb 52Te 53I 54Xe
7 6 55Cs 56Ba * 72Hf 73Ta 74W 75Re 76Os 77Ir 78Pt 79Au 80Hg 81Tl 82Pb 83Bi 84Po 85At 86Rn
8 7 87Fr 88Ra ** 104Rf 105Db 106Sg 107Bh 108Hs 109Mt 110Ds 111Rg 112Cn 113Uut 114Uuq 115Uup 116Uuh 117Uus 118Uuo
9 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
10 * Lanthanoids 57La 58Ce 59Pr 60Nd 61Pm 62Sm 63Eu 64Gd 65Tb 66Dy 67Ho 68Er 69Tm 70Yb 71Lu <NA> <NA>
11 ** Actinoids 89Ac 90Th 91Pa 92U 93Np 94Pu 95Am 96Cm 97Bk 98Cf 99Es 100Fm 101Md 102No 103Lr <NA> <NA>
library(XML)
library(plyr)
url = 'http://en.wikipedia.org/wiki/Periodic_table'
# don't forget to parse the HTML, doh!
doc = htmlParse(url)
# get every link in a table cell:
links = getNodeSet(doc, '//table/tr/td/a')
# make a data.frame for each node with non-blank text, link, and 'title' attribute:
df = ldply(links, function(x) {
text = xmlValue(x)
if (text=='') text=NULL
symbol = xmlGetAttr(x, 'title')
link = xmlGetAttr(x, 'href')
if (!is.null(text) & !is.null(symbol) & !is.null(link))
data.frame(symbol, text, link)
} )
# only keep the actual elements -- we're lucky they're first!
df = head(df, 118)
head(df)
symbol text link
1 Hydrogen H /wiki/Hydrogen
2 Helium He /wiki/Helium
3 Lithium Li /wiki/Lithium
4 Beryllium Be /wiki/Beryllium
5 Boron B /wiki/Boron
6 Carbon C /wiki/Carbon
SELECT
?elementLabel
?symbol
?article
WHERE
{
?element wdt:P31 wd:Q11344;
wdt:P1086 ?n;
wdt:P246 ?symbol.
OPTIONAL {
?article schema:about ?element;
schema:inLanguage "en";
schema:isPartOf <https://en.wikipedia.org/>.
}
FILTER (?n >= 1 && ?n <= 118).
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" . }
}
ORDER BY ?n