使用 R 和 XML 包,我使用 XML htmlParse 函数解析了一个 ("HTMLInternalDocument" "HTMLInternalDocument" "XMLInternalDocument" "XMLAbstractDocument") 对象。我感兴趣的 xml 对象中的行(见下文)包含我希望返回的两个值。
除了来自 class=gsc_1usr_name 的值(返回“Konrad Wrzecionkowski”)之外,我还需要提取“user=”下的值,在本例中为“QnVgFlYAAAAJ”。我用 xpathSApply 尝试了几种语法变体,它总是返回 NULL。诚然,我对 xml 很无知,有什么想法吗?有没有办法可以将它强制转换为不同的对象类,例如列表,然后在向量上使用拆分?标准强制转换(例如 as.list、as.character)似乎不适用于这个对象类。
search.page <- "http://scholar.google.com/citations?hl=en&view_op=search_authors&mauthors=GVN Powell World Wildlife Fund"
x <- XML::htmlParse(search.page, encoding="UTF-8")
它返回一个 xml 对象,下面是单个条目的子集,共 10 个。该h3 class="gsc_1usr_name
行包含每个条目中我想要检索的值(对于所有 10 个)。
</div>
</div>
<div class="gsc_1usr gs_scl">
<div class="gsc_1usr_photo"><a href="/citations?user=QnVgFlYAAAAJ&hl=en&oe=ASCII"><img src="/citations?view_op=view_photo&user=QnVgFlYAAAAJ&citpid=3" sizes="(max-width:599px) 75px,(max-width:1251px) 100px, 120px" srcset="/citations?view_op=view_photo&user=QnVgFlYAAAAJ&citpid=3 128w,/citations?view_op=medium_photo&user=QnVgFlYAAAAJ&citpid=3 256w" alt="Konrad Wrzecionkowski"></a></div>
<div class="gsc_1usr_text">
<h3 class="gsc_1usr_name"><a href="/citations?user=QnVgFlYAAAAJ&hl=en&oe=ASCII">Konrad Wrzecionkowski</a></h3>
<div class="gsc_1usr_aff">Zachodniopomorski Uniwersytet Technologiczny w Szczecinie, Błękitny Patrol <span class="gs_hlt">WWF </span>Polska</div>
<div class="gsc_1usr_eml">Verified email at <span class="gs_hlt">wwf</span>.pl</div>
<div class="gsc_1usr_emlb">@wwf.pl</div>
<div class="gsc_1usr_int">
<a class="gsc_co_int" href="/citations?view_op=search_authors&hl=en&oe=ASCII&mauthors=label:ichtiologia_ochrona_przyrody">ichtiologia / ochrona przyrody</a> </div>
</div>
</div>
对 xpathSApply 函数使用以下语法,我返回“GVN Powell”,但也想要来自 user= 的值。我已经尝试了 h3[@user=''] 的变体,包括类的子查询,但是不能让其他任何东西工作。
XML::xpathSApply(x, "//h3[@class='gsc_1usr_name']", xmlValue)
我一直使用的方法是使用 url 和 readLines。然后我使用 strsplit 来提取所需的值。
auth.names <- "Konrad Wrzecionkowski WWF"
search.page <- paste("http://scholar.google.com/citations?hl=en&view_op=search_authors&mauthors=", auth.names, sep="")
x <- readLines(url(search.page))
x <- strsplit(x[[1]], split="user=")[[1]][2]
x <- strsplit(x, split="&")[[1]][1]
这里的问题是 Google Scholar 似乎不喜欢网络抓取,并且代码会定期失败,并出现“无法打开连接,HTTP 状态为 '503 服务不可用”错误。但是,htmlParse 似乎并非如此。