0

当我在表达式中使用 XPath 1.0 的 substring-before 或 -after 时,会发生一些事情,使我的后续 xmlValue 调用引发错误。下面的代码显示 XPath 表达式与 httr 一起工作得很好,但随后不能与 RCurl 一起工作。

require(XML)
require(httr)
doc <- htmlTreeParse("http://www.cottonbledsoe.com/CM/Custom/TOCContactUs.asp", useInternal = TRUE)
(string <- xpathSApply(doc, "substring-before(//div[@id = 'contactInformation']//p, 'Phone')", xmlValue, trim = TRUE))


require(RCurl)
fetch <- GET("http://www.cottonbledsoe.com/CM/Custom/TOCContactUs.asp")
contents <- content(fetch)
locsnodes <- getNodeSet(contents, "//div[@id = 'contactInformation']//p")  
sapply(locsnodes, xmlValue)

[1] "500 West Illinois, Suite 300\r\n Midland, Texas 79701\r\n Phone: 432-897-1440\r\n Toll Free: 866-721-6665\r\n Fax: 432-682-3672"

上面的代码工作正常,但我想在它之前使用 substring-before 来清理结果,如下所示:

[1] "500 West Illinois, Suite 300\r\n Midland, Texas 79701\r\n "

locsnodes <- getNodeSet(contents, "substring-before(//div[@id = 'contactInformation']//p, 'Phone')")  
sapply(locsnodes, xmlValue)

Error in UseMethod("xmlValue") : 
  no applicable method for 'xmlValue' applied to an object of class "character"

我如何使用substring-以及 RCurl,因为 RCurl 是为以后使用的更复杂操作选择的包?

感谢您的任何指导(或更好的方式来实现我想要的

4

2 回答 2

3

仅当返回节点集时才调用in or Indeed中的fun参数。在您的情况下,正在返回一个字符串并且该函数被忽略:xpathSApplygetNodeSet

require(XML)
require(RCurl)
doc <- htmlParse("http://www.cottonbledsoe.com/CM/Custom/TOCContactUs.asp")
locsnodes <- getNodeSet(doc
                        , "substring-before(//div[@id = 'contactInformation']//p, 'Phone')")  
> locsnodes
[1] "500 West Illinois, Suite 300\r\n Midland, Texas 79701\r\n "

> str(locsnodes)
 chr "500 West Illinois, Suite 300\r\n Midland, Texas 79701\r\n "

fun参数未在此处使用xpathSApply

> xpathSApply(doc, "substring-before(//div[@id = 'contactInformation']//p, 'Phone')"
+             , function(x){1}
+ )
[1] "500 West Illinois, Suite 300\r\n Midland, Texas 79701\r\n "

因为您的 xpath 没有返回节点集。

于 2014-10-05T13:01:36.503 回答
1

这是使用rvest包的一种稍微不同的方法 。我认为您通常最好在 R 中进行字符串操作,而不是在 xpath 中

library(rvest)

contact <- html("http://www.cottonbledsoe.com/CM/Custom/TOCContactUs.asp")

contact %>%
  html_node("#contactInformation p") %>%
  html_text() %>%
  gsub(" Phone.*", "", .)
#> [1] "500 West Illinois, Suite 300\r\n Midland, Texas 79701\r\n"
于 2014-10-09T11:48:32.767 回答