加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xml – 为“周期表”和所有链接搜索维基页面

发布时间:2020-12-16 07:47:28 所属栏目:百科 来源:网络整理
导读:我想刮掉以下维基文章: http://en.wikipedia.org/wiki/Periodic_table 这样我的R代码的输出将是一个包含以下列的表: 化学元素简称 化学元素全称 化学元素维基页面的URL (显然,每个化学元素都有一行) 我试图使用XML包来获取页面内的值,但似乎一直停留在开头
我想刮掉以下维基文章: http://en.wikipedia.org/wiki/Periodic_table

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

>化学元素简称
>化学元素全称
>化学元素维基页面的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"
塔尔 – 我认为这很容易.我将指向read_MLMLTable(),这是我在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>

名称消失了,原子序数会进入符号.

所以回到绘图板……

我的DOM walk-fu不是很强大,所以这并不漂亮.它获取表格单元格中的每个链接,只保留具有“标题”属性的那些(符号所在的位置),并在data.frame中粘贴您想要的内容.它也获得了页面上的所有其他链接,但我们很幸运,元素是前118个这样的链接:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读