使用R和XML,XPath 1.0表达式能否消除返回内容中的重复项?

使用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

当我使用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() < 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]。