使用R和XML,XPath 1.0表达式能否消除返回内容中的重复项?
当我使用XPath1.0从以下URL提取内容时,返回的城市包含重复的内容,从伯明翰开始。返回的完整值集超过140个,因此我将其截断。XPath表达式是否有避免重复的方法使用R和XML,XPath 1.0表达式能否消除返回内容中的重复项?,r,xpath,xml-parsing,R,Xpath,Xml Parsing,当我使用XPath1.0从以下URL提取内容时,返回的城市包含重复的内容,从伯明翰开始。返回的完整值集超过140个,因此我将其截断。XPath表达式是否有避免重复的方法 require(XML) doc <- htmlTreeParse("http://www.littler.com/locations", useInternal = TRUE) xpathSApply(doc, "//div[@class = 'mm-location-usa']//a[position() < 1
require(XML)
doc <- htmlTreeParse("http://www.littler.com/locations", useInternal = TRUE)
xpathSApply(doc, "//div[@class = 'mm-location-usa']//a[position() < 12]", xmlValue, trim = TRUE)
[1] "Birmingham" "Mobile" "Anchorage" "Phoenix" "Fayetteville" "Fresno"
[7] "Irvine" "L.A. - Century City" "L.A. - Downtown" "Sacramento" "San Diego" "Birmingham"
[13] "Mobile" "Anchorage" "Phoenix" "Fayetteville" "Fresno" "Irvine"
[19] "L.A. - Century City" "L.A. - Downtown" "Sacramento" "San Diego"
是否有一个XPath表达式或按照[not duplicate]的思路进行处理
此外,各种[position顺便说一句,这不是同一个问题,与重复节点有关的问题也不是,例如,你不能这样做吗
require(XML)
doc <- htmlTreeParse("http://www.littler.com/locations", useInternal = TRUE)
xPath <- "//div[@class = 'mm-location-usa']//a[position() < 12]"
unique(xpathSApply(doc, xPath, xmlValue, trim = TRUE))
# [1] "Birmingham" "Mobile" "Anchorage"
# [4] "Phoenix" "Fayetteville" "Fresno"
# [7] "Irvine" "L.A. - Century City" "L.A. - Downtown"
# [10] "Sacramento" "San Diego"
你就不能这样做吗
require(XML)
doc <- htmlTreeParse("http://www.littler.com/locations", useInternal = TRUE)
xPath <- "//div[@class = 'mm-location-usa']//a[position() < 12]"
unique(xpathSApply(doc, xPath, xmlValue, trim = TRUE))
# [1] "Birmingham" "Mobile" "Anchorage"
# [4] "Phoenix" "Fayetteville" "Fresno"
# [7] "Irvine" "L.A. - Century City" "L.A. - Downtown"
# [10] "Sacramento" "San Diego"
有一个函数用于此,称为distinct value,但不幸的是,它仅在XPath 2.0中可用。在R中,您仅限于XPath 1.0 你能做的就是
//div[@class = 'mm-location-usa']//a[position() < 12 and not(normalize-space(.) = normalize-space(following::a))]
用通俗易懂的英语说:
查找div元素,但仅当其class属性值等于mm-location-usa时。查找这些div元素的后代a元素,但仅当a元素的位置小于12且该a元素的规范化文本内容不等于后面的a元素的文本内容时
但这是一种计算密集型方法,并不是最优雅的方法。我建议您采用jlhoward的解决方案。有一个函数用于此,称为distinct value,但不幸的是,它仅在XPath 2.0中可用。在R中,您仅限于XPath 1.0 你能做的就是
//div[@class = 'mm-location-usa']//a[position() < 12 and not(normalize-space(.) = normalize-space(following::a))]
用通俗易懂的英语说:
查找div元素,但仅当其class属性值等于mm-location-usa时。查找这些div元素的后代a元素,但仅当a元素的位置小于12且该a元素的规范化文本内容不等于后面的a元素的文本内容时
但这是一种计算密集型方法,并不是最优雅的方法。我建议您采用jlhoward的解决方案。或者,您可以创建一个XPath来处理第一个div中的li标记,因为它们是重复的div:
我在这里假设您要查找我们的位置。或者,您可以创建一个XPath来处理第一个div中的li标记,因为它们是重复的div:
我在这里做了一个假设,你在寻找我们的位置。所以问题归结为,你能在整理列表时识别重复的位置吗?是的,但正如我在对jhoward回答的评论中所指出的,这是多个站点中的一个,所以我想在一个调用中构建表达式。这有意义吗?所以问题归结为,你能在整理列表时识别重复项吗?是的,但正如我在对jhoward回答的评论中所指出的,这是多个站点中的一个,所以我想在一个调用中构建表达式。有道理吗?谢谢。好主意,它可以在这个单一实例上工作,但是有多个站点和一个大型脚本来抓取它们。是否可以将唯一调用加入XPath调用?也许把电话换成别致的?谢谢。好主意,它可以在这个单一实例上工作,但是有多个站点和一个大型脚本来抓取它们。是否可以将唯一调用加入XPath调用?也许可以用独特的?很好的解决方案来结束通话。当我尝试这个方法时,我得到了一些重复的结果,但是按照同样的思路,这个xPath表达式似乎可以工作://div[@class='mm location usa']//a[position<12和notfollowing::a=text]。这是一个很好的解决方案。当我尝试这样做时,我得到了一些重复的xPath表达式,但是按照同样的思路,这个xPath表达式似乎可以工作://div[@class='mm location usa']//a[position<12,notfollowing::a=text]。