我需要了解如何将substring-before或-after应用于多个节点。
下面的代码不仅会返回我想要的城市,还会返回其他不需要的详细信息。
require(XML)
require(httr)
doc <- htmlTreeParse("http://www.cpmy.com/contact.asp", useInternal = TRUE)
> (string <- xpathSApply(doc, "//div[@id = 'leftcol']//p", xmlValue, trim = TRUE))
[1] "Philadelphia Office1880 JFK Boulevard10th FloorPhiladelphia, PA 19103Tel: 215-587-1600Fax: 215-587-1699Map and Directions"
[2] "Westmont Office216 Haddon AvenueSentry Office Plaza, Suite 703Westmont, NJ 08108Tel: 856-946-0400Fax: 856-946-0399Map and Directions"
[3] "Boston Office50 Congress StreetSuite 430Boston, MA 02109Tel: 617-854-8315Fax: 617-854-8311Map and Directions"
[4] "New York Office5 Penn Plaza23rd FloorNew York, NY 10001Tel: 646-378-2192Fax: 646-378-2001Map and Directions"
我添加了substring-before(),但它只返回第一个元素,正确缩短,但不是剩下的三个元素:
> (string <- xpathSApply(doc, "substring-before(//div[@id = 'leftcol']//p, 'Office')", xmlValue, trim = TRUE))
[1] "Philadelphia "
我应该如何修改我的XPath表达式以缩短形式提取 - 在&#34; Office&#34;所有四个要素?
谢谢。
答案 0 :(得分:1)
如果您必须使用XPATH
处理此问题,则可以使用两步过程。首先选择节点,然后从当前节点完成子串处理:
require(XML)
doc <- htmlParse("http://www.cpmy.com/contact.asp")
sapply(doc["//div[@id = 'leftcol']//p"]
, getNodeSet, "substring-before(./b/text(), 'Office')")
[1] "Philadelphia " "Westmont " "Boston " "New York "
XPATH 1.0中的http://www.w3.org/TR/xpath/#section-String-Functions
通过返回文档顺序中第一个节点集中节点的字符串值,将节点集转换为字符串。如果节点集为空,则返回空字符串。
因此您只需返回一个结果,因此需要两个步骤。在XPATH 2.0中,你可以在XPATH中使用字符串函数,所以
"//div[@id = 'leftcol']//p/b/text()[substring-before(. , 'Office')]"
或类似的东西可能会返回你想要的东西。