将一个难题放入一个句子中,但我试图从下一页中删除一些HTML
http://www.ncbi.nlm.nih.gov/snp/?term=(human[Organism])+AND+GLRA3[Gene Name]
我可以使用R抓取我需要的东西,但因为浏览器只显示前20个条目,所以我只能使用相应的html。这会导致问题,因为我想要抓取所有条目,而不仅仅是浏览器上页面提供的条目。无论如何,这是我的R代码
library(XML)
library(httr)
#Go to Nectar Mutation and get SNP refs
dbsnp.searchterm="(human[Organism])+AND+GLRA1[Gene Name]"
dbsnp.url=paste0("http://www.ncbi.nlm.nih.gov/snp/?term=",dbsnp.searchterm)
dbsnp.get=GET(dbsnp.url)
dbsnp.content=content(dbsnp.get, as="text")
links<-xpathSApply(htmlParse(dbsnp.content), "//a[contains(@href, 'snp_ref')]",xmlGetAttr,"href")
和结果
> links
[1] "/projects/SNP/snp_ref.cgi?rs=116474260"
[2] "/projects/SNP/snp_ref.cgi?rs=121918408"
[3] "/projects/SNP/snp_ref.cgi?rs=121918409"
[4] "/projects/SNP/snp_ref.cgi?rs=121918410"
[5] "/projects/SNP/snp_ref.cgi?rs=121918411"
[6] "/projects/SNP/snp_ref.cgi?rs=121918412"
[7] "/projects/SNP/snp_ref.cgi?rs=121918413"
[8] "/projects/SNP/snp_ref.cgi?rs=121918414"
[9] "/projects/SNP/snp_ref.cgi?rs=121918415"
[10] "/projects/SNP/snp_ref.cgi?rs=121918416"
[11] "/projects/SNP/snp_ref.cgi?rs=121918417"
[12] "/projects/SNP/snp_ref.cgi?rs=121918418"
[13] "/projects/SNP/snp_ref.cgi?rs=267600494"
[14] "/projects/SNP/snp_ref.cgi?rs=267606848"
[15] "/projects/SNP/snp_ref.cgi?rs=281864912"
[16] "/projects/SNP/snp_ref.cgi?rs=281864913"
[17] "/projects/SNP/snp_ref.cgi?rs=281864914"
[18] "/projects/SNP/snp_ref.cgi?rs=281864915"
[19] "/projects/SNP/snp_ref.cgi?rs=281864916"
[20] "/projects/SNP/snp_ref.cgi?rs=281864917"
您会注意到我需要4058个条目。
答案 0 :(得分:1)
我整个下午花了我一半的时间,我仍然只有一半的解决方案(第一次使用XML)。无论如何,我发现你可以使用以下链接以XML格式获得结果;
http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=SNP&term=(human[Organism])+AND+GLRA3[Gene+Name]
db
代表您要搜索的数据库,term
相当不言自明。
在结果之上,您将看到;
<Count>4736</Count>
<RetMax>20</RetMax>
在此基础上,ID列表开始显示20个ID,相当于rs
中的值;
/projects/SNP/snp_ref.cgi?rs=
的 116474260 强>
您可以使用GET
函数在R中获取此信息。现在,如果您能找到一种方法让R读取Count
行中的数字(这是可能的结果),然后再次使用GET
函数,但现在将&RetMax=X
添加到链接的末尾,其中X是Count
行中的数字。
例如;
http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=SNP&term=(human[Organism])+AND+GLRA3[Gene+Name]&RetMax=4736
现在所有的ID都是在R中导入的(再次,我缺乏从数据中很好地提取它们的技能,因此可能是其他人想出来的。)
希望这有帮助!
答案 1 :(得分:1)
你会想要使用@Roost找到的api。我将补充说httr有一个内置的方法来添加查询参数,你应该使用它,因为它会自动对你的查询参数进行URL编码。
在XML中,如果您对xPath不太熟悉,使用xmlToList
会更容易,但您可以选择解析XML的方法。
library(XML)
library(httr)
# Go to api and get Count
dbsnp.searchterm <- "(human[Organism]) AND GLRA3[Gene Name]"
dbsnp.url <- "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi"
dbsnp.get <- GET(dbsnp.url, query=list(db="SNP", term=dbsnp.searchterm))
dbsnp.content <- content(dbsnp.get, as="text")
dbsnp.xml <- xmlParse(dbsnp.content)
max_count <- xmlToList(dbsnp.xml)$Count
# Use the Count to form the query that you want
dbsnp.full.get <- GET(dbsnp.url, query=list(
db="SNP",
term=dbsnp.searchterm,
RetMax=max_count))
dbsnp.full.content <- content(dbsnp.full.get, as="text")
dbsnp.full.xml <- xmlParse(dbsnp.full.content)
dbsnp.full.list <- xmlToList(dbsnp.full.xml)
prefix <- "/projects/SNP/snp_ref.cgi?rs="
dbsnp.links <- paste0(prefix, unlist(dbsnp.full.list$IdList))