使用-relenium-在R中刮擦javascript生成的表

时间:2014-05-01 22:40:38

标签: javascript r web-scraping

最近,从这个非常有用的问题(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)。

根据感兴趣的表所在的网站的结构,我必须单击第一个按钮来访问按名称排序的表,然后单击第二个按钮以浏览我要导出的所有下一个表。在实践中,我必须:

  1. 点击Sortarealfabetică按钮
  2. 复制10行表格的前9列
  3. 点击右键(名为 Pagina urmatoare
  4. 重复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-

0 个答案:

没有答案
相关问题