最近,从这个非常有用的问题(Scraping html tables into R data frames using the XML package)开始,我成功地使用XML
包来抓取HTML表格。
现在我试图从这里提取Javascript生成的表: Tables 2013(然后点击“Sortarealfabetică”)。 我有兴趣导出pag.1-pag.10数据的前9列。
我在论坛上经历了不同的相关问题,包括一些建议不使用R执行此类任务的地方,以及similar question,但这并不能证明对我的问题直接有用。正如所建议的那样,我一直在阅读有关Relenium
包的信息(请参阅开发人员的玩具示例here)。
根据感兴趣的表所在的网站的结构,我必须单击第一个按钮来访问按名称排序的表,然后单击第二个按钮以浏览我要导出的所有下一个表。在实践中,我必须:
重复2-3次10次。
通过使用Chrome检查器(工具>开发者工具),我找到了两个按钮的以下路径:
/html/body/table/tbody/tr[1]/td/table[2]/tbody/tr[2]/td/table/tbody/tr/td[2]/a
/html/body/table/tbody/tr[1]/td/table[3]/tbody/tr/td[4]/table
我开始使用此代码以完成第1步:
library(relenium)
firefox <- firefoxClass$new()
firefox$get("http://bacalaureat.edu.ro/2013/rapoarte/rezultate/index.html")
buttonElement <- firefox$findElementByXPath("/html/body/table/tbody/tr[1]/td/table[2]/tbody/tr[2]/td/table/tbody/tr/td[2]/a")
buttonElement$click()
但是我收到以下错误:
[1] "Error: NoSuchElementException"
[1] "Thrown by Firefox$findElement(By by) and webElement$findElement(By by)."
我不知道这是否是一种更容易的方法,但是第3点的另一种方法是浏览pag.1-pag.10可以使用网页的下拉菜单。 第1页和第2页的路径是:
//*[@id="PageNavigator"]/option[1]
//*[@id="PageNavigator"]/option[2]
显然,即使能够通过按钮或滚动菜单在10个表中导航之前,关键问题仍然是提取每个表中包含的数据。
使用此代码,我尝试专注于仅提取第一个表的前9列(然后代码可以通过"http://bacalaureat.edu.ro/.../page_2.html"
,"http://bacalaureat.edu.ro/.../page_3.html"
等进行迭代):
library(XML)
library(relenium)
firefox <- firefoxClass$new()
firefox$get("http://bacalaureat.edu.ro/2013/rapoarte/rezultate/alfabetic/page_1.html")
doc <- htmlParse(firefox$getPageSource())
tables <- readHTMLTable(doc, stringsAsFactors=FALSE)
但输出非常混乱。我不知道这个maks是否有意义,而我只是在猜测,但可能有必要深入了解javascript代码并逐个单元格提取表格中的信息。
例如,对于第一个人,感兴趣的9个变量值由以下XPath表征:
//*[@id="mainTable"]/tbody/tr[3]/td[1]
//*[@id="mainTable"]/tbody/tr[3]/td[2]
//*[@id="mainTable"]/tbody/tr[3]/td[3]/a
//*[@id="mainTable"]/tbody/tr[3]/td[4]/a
//*[@id="mainTable"]/tbody/tr[3]/td[5]/a
//*[@id="mainTable"]/tbody/tr[3]/td[6]/a
//*[@id="mainTable"]/tbody/tr[3]/td[7]
//*[@id="mainTable"]/tbody/tr[3]/td[8]
//*[@id="mainTable"]/tbody/tr[3]/td[9]
使用这些路径,每个单元格的条目可以保存到R
向量中,并且可以对所有其他特定于个别的数据行重复该过程。像这样继续下去是明智的吗?如果是这样,您将如何处理-relenium-
?