Consistently Infrequent

November 8, 2011

Web Scraping Google Scholar (Partial Success)

Filed under: R — Tags: , , , , , — Tony Breyal @ 2:32 pm

UPDATE: This function has been superseded by googleScholarXScraper()

I wanted to scrape the information returned by a Google Scholar web search into an R data frame as a quick XPath exercise. The following will successfully extract  the ‘title’, ‘url’ , ‘publication’ and ‘description’.  If any of these fields are not available, as in the case of a citation, the corresponding cell in the data frame will have NA.

# load packages

get_google_scholar_df <- function(u, omit.citation = TRUE) {
  html <- getURL(u)

  # parse HTML into tree structure
  doc <- htmlParse(html)

  # make data frame from available information on page
  df <- data.frame(
    title = xpathSApply(doc, "/html/body/div[@class='gs_r']/div[@class='gs_rt']/h3", xmlValue),
    url = xpathSApply(doc, "//html//body//div[@class='gs_r']//h3", function(x) ifelse(is.null(xmlChildren(x)$a), NA, xmlAttrs(xmlChildren(x)$a, 'href'))),
    publication = xpathSApply(doc, "//html//body//div[@class='gs_r']//font//span[@class='gs_a']", xmlValue),
    description = xpathSApply(doc, "//html//body//div[@class='gs_r']//font", xmlValue),
    type = xpathSApply(doc, "//html//body//div[@class='gs_r']//h3", function(x) xmlValue(xmlChildren(x)$span)),
    footer = xpathSApply(doc, "/html/body/div[@class='gs_r']/font/span[@class='gs_fl']", xmlValue),

  # Clean up
  df$title <- sub(".*\\] ", "", xx)
  df$description <- sapply(1:dim(df)[1], function(i) gsub(df$publication[i], "", df$description[i], fixed = TRUE))
  df$description <- sapply(1:dim(df)[1], function(i) gsub(df$footer[i], "", df$description[i], fixed = TRUE))
  df$type <- gsub("\\]", "", gsub("\\[", "", df$type))

  # free doc from memory

  # ensure urls start with "http" to avoid google references to the search page
  ifelse(omit.citation, return(na.omit(df)), return(df))

u <- "'s+gate+2&btnG=Search&as_sdt=0,5&as_ylo=&as_vis=0"
df <- get_google_scholar_df(u, omit.citation = TRUE)

The above will produce results as follows:

# [1] ""
# [2] ""
# [3] ""
# [4] ""
# [5] ""
# [6] ""

Or the full data frame (using t() for display purposes):


# title       "Baldur's gate and history: Race and alignment in digital role playing games"
# url         ""
# publication "C Warnes - Digital Games Research Conference (DiGRA), 2005 -"
# description "... It is argued that games like Baldur's Gate I and II cannot be properly understood without\nreference to the fantasy novels that inform them. ... Columbia University Press, New York, 2003.\npp 2-3. 12. 8. Hess, Rhyss. Baldur's Gate and Tales of the Sword Coast. ... \n"
# type        "PDF"
# footer      "Cited by 8 - Related articles - View as HTML - All 10 versions"

That was the most information I could pull off a Google Scholar search using XPath though I have no doubt someone with more knowledge could pull more elements out! Many thanks to John Colby for helping me out with my question over on which made the above possible. Trying to get more elements out just didn’t seem to work for me.


1 Comment »

  1. […] et je ne vois pas de manière explicite les conditions d'utilisation Aussi… Et la mise à jour:… Non pas une stricte réponse, mais je […]

    Pingback by r - Comment télécharger les résultats de recherche sur google scholar à l'aide de r? — December 23, 2018 @ 2:23 pm

RSS feed for comments on this post. TrackBack URI

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

Blog at

%d bloggers like this: