очистить URL-адрес от поиска Google, используя r httr

Я хотел бы получить URL-адрес из веб-поиска Google следующим образом:

library(httr)
search.term="httr+package+daterange:%3A2456294-2456659"
url.name=paste0("https://www.google.com/search?q=",search.term)
url.get=GET(url.name)
url.content=content(url.get)

Тогда попытка получить ссылки из результата не удалась:

links <- xpathApply(url.content, "//h3//a[@href]", function(x) xmlAttrs(x)[[1]])
Error in UseMethod("xpathApply") : 
no applicable method for 'xpathApply' applied to an object of class "XMLDocumentContent"

Как лучше всего получить ссылки из url.content?


person Henk    schedule 02.01.2014    source источник


Ответы (1)


Попробуйте content() с as="text", чтобы он не возвращал объект класса XMLDocumentContent:

library(httr)
search.term="httr+package+daterange:%3A2456294-2456659"
url.name=paste0("https://www.google.com/search?q=",search.term)
url.get=GET(url.name)
url.content=content(url.get, as="text")
links <- xpathSApply(htmlParse(url.content), "//a/@href")
head(links,3)
# href 
# "https://www.google.com/webhp?tab=ww" 
# href 
# "https://www.google.com/search?q=httr%2Bpackage%2Bdaterange::2456294-2456659&um=1&ie=UTF-8&hl=en&tbm=isch&source=og&sa=N&tab=wi" 
# href 
# "https://maps.google.com/maps?q=httr%2Bpackage%2Bdaterange::2456294-2456659&um=1&ie=UTF-8&hl=en&sa=N&tab=wl" 

Обновление:

Как отмечает Джейк в комментарии, это также работает:

url.get=GET(url.name)
links <- xpathSApply(htmlParse(url.get), "//a/@href")
person lukeA    schedule 02.01.2014
comment
вы также можете htmlParse(url.get) и вообще пропустить content - person Jake Burkhead; 02.01.2014
comment
правда, @JakeBurkhead. :) - person lukeA; 02.01.2014
comment
Вы должны быть в состоянии сделать xpathSApply(content(url.get), "//a/@href"). Обычно я также добавляю stop_for_status(url.get), чтобы вы сразу знали, если HTTP-запрос не удался (в отличие от синтаксического анализа html). - person hadley; 02.01.2014
comment
И причина, по которой это не работает из коробки, заключается в том, что с классами в пакете XML что-то не так, по сравнению с тем, что я возвращаю из content(). Я зарегистрировал проблему на github.com/hadley/httr/issues/66. - person hadley; 02.01.2014
comment
@lukeA - спасибо, работает! hadley - xpathSApply(content(url.get), //a/@href) выдает: Ошибка в UseMethod(xpathApply): нет применимого метода для 'xpathApply', примененного к объекту класса XMLDocumentContent - person Henk; 03.01.2014
comment
можно также использовать useInternalNode=T с функцией httpParseTree, чтобы сделать очистку. Например, для xmlparsed‹-httpParseTree(url,useInternalNode=T), а затем xpathSApply(xmlparsed,//a/@href,xmlValue) сделает то же самое - person igauravsehrawat; 16.01.2014