R解析HTML文档并使用xpath获取两种模式的所有匹配

时间:2014-06-10 23:41:38

标签: html r xpath

所以,我从FIFA worldcup网站解析了HTML代码,想要获得所有匹配项:

 wcup <- htmlTreeParse("http://www.fifa.com/worldcup/matches/", useInternalNodes=T)

然而,一个国家的领域是't-nText kern',而其他国家的领域是't-nText'。

 <span class="t-nText kern">Bosnia and Herzegovina</span>

因此,如果我使用这个命令,我会想念'波斯尼亚和黑塞哥维那',就像这个命令:

xpathSApply(wcup, "//span[@class='t-nText ']", xmlValue)

那么,有什么方法可以同时搜索属性't-nText'和't-nText kern'?或者你还有其他解决方案吗?我希望保持匹配的顺序。

xpath不支持逻辑OR:

xpathSApply(wcup, "//span[@class='t-nText ' || 't-nText kern']", xmlValue)
XPath error : Invalid expression
//span[@class='t-nText ' || 't-nText kern']
                          ^
XPath error : Invalid expression
//span[@class='t-nText ' || 't-nText kern']
                                          ^
Error in xpathApply.XMLInternalDocument(doc, path, fun, ..., namespaces = namespaces,  : 
  error evaluating xpath expression //span[@class='t-nText ' || 't-nText kern']

2 个答案:

答案 0 :(得分:4)

使用'或'或'start-with()',

wcup["//span[@class='t-nText kern' or @class='t-nText ']"]
wcup["//span[starts-with(@class, 't-nText ')]"]

答案 1 :(得分:2)

我最初发布这个,然后注意到需要订单,所以我搜索了SO“XPath OR”

为什么不直接将两个搜索的结果附加在一起:

c( xpathSApply(wcup, "//span[@class='t-nText kern']", xmlValue), 
   xpathSApply(wcup, "//span[@class='t-nText ']", xmlValue)
  )

瞧,我想出来了:

xpathSApply(wcup, "//*[starts-with(@class,'t-nText')]", xmlValue)

这似乎与马丁摩根的解决方案类似。我没有意识到XPath是它自己的语言。猜猜我至少落后了10年。