R XML + XPath - 具有多个条件的getNodeSet

时间:2012-11-30 00:50:22

标签: xml r xpath web-scraping

我是XPath的新手 - 请放轻松我。

无法在目标网页上为没有大量结构的元素提取XPath。

数据集是新泽西州学校report cards。个人报告卡看起来像this

我已经找到了如何提取具有summary标记的表格:

url <- paste("http://education.state.nj.us/rc/rc11/rcreport.php?c=",
  all_sch[i,1],";d=",all_sch[i,2],";s=",all_sch[i,3],sep = '')
doc = htmlParse(url)
admin_salaries = getNodeSet(doc, '//table[@summary="Administrative Salaries and Benefits"]')

但是在没有很多额外识别信息可以解决的情况下遇到麻烦。

例如,具有学校名称和分区的表格如下所示:

        <table cellpadding="0" cellspacing="0">
          <tr>
            <td><strong>SCHOOL:</strong></td>
            <td>&nbsp;New Jersey Ave</td>
          </tr>
          <tr>
            <td><strong>COUNTY:</strong></td>
            <td>&nbsp;Atlantic</td>
          </tr>
          <tr>
            <td><strong>DISTRICT:</strong></td>
            <td>&nbsp;Atlantic City</td>
          </tr>
        </table>

我的策略是“查找表格中的节点并使用文本COUNTY

Reading尽可能多地关于XPath,我正在尝试这个:

names = getNodeSet(doc,'//table and //*[contains(text(),"COUNTY")]')

但它不是返回表节点,而是给我一个布尔TRUE值。

所以,问题是:如何使用XPath查找具有COUNTY和SCHOOL文本的表?

我尝试了很多其他策略,但收效甚微。其他人建议的一种方法就是使用以下方法提取每个表数据单元:

xpathApply( htmlTreeParse(url, useInt=T), "//td", function(x) xmlValue(x))

但是模板与缺失的数据不一致 - 不完整的报告具有完全不同的结构,并且元素在2,000多个页面中的位置不同。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:5)

使用xpath获取所有表

xpathSApply( doc, "//table[contains(.,'SCHOOL:') 
                  and contains(.,'COUNTY') ]",xmlValue)

获取行

xpathSApply( doc, "//tr/td[contains(.,'SCHOOL:') 
                   and contains(.,'COUNTY') ]",xmlValue)