使用Xpath“start with”来解析xhtml时遇到麻烦

时间:2011-02-01 03:51:28

标签: xpath yql

我正在尝试解析网页以从论坛获取帖子 每条消息的开头都以以下格式开头

<div id="post_message_somenumber">

我只想获得第一个

我在yql中尝试了xpath='//div[starts-with(@id, '"post_message_')]'但没有成功 我还在学习这个,有人有建议

3 个答案:

答案 0 :(得分:5)

  

我在yql中尝试xpath='//div[starts-with(@id, '"post_message_')]'没有   成功我还在学习这个,   任何人都有建议

如果问题不是由于许多嵌套的撇号和未闭合的双引号,那么最可能的原因(我们只能猜测而不显示XML文档)是使用默认命名空间。

指定默认命名空间中元素的名称是XPath中最常见的FAQ。如果您在SO或互联网上搜索“XPath默认命名空间”,您会找到许多具有正确解决方案的来源。

通常,必须调用一个特殊方法,将前缀(例如"x:")绑定到默认命名空间。然后,在XPath表达式中,每个元素名称"someName"必须替换为"x:someName

这是 good answer how to do this in C#

阅读您的语言/ xpath-engine的文档,了解在特定环境中应该如何进行类似的操作。

答案 1 :(得分:4)

我认为我有一个不需要处理命名空间的解决方案。

选择所有匹配的div

//div[@id[starts-with(.,"post_message")]]

但是你说你只想要“第一个”(我猜你的意思是整个页面中的第一个“命中”?)。这是一个略微修改,选择只是第一个匹配的结果

(//div[@id[starts-with(.,"post_message")]])[1]

这些使用点来表示starts-with()函数中的id值。您可能必须使用您的语言转义特殊字符。

在PowerShell中它对我很有用:

# Load a sample xml document
$xml = [xml]'<root><div id="post_message_somenumber"/><div id="not_post_message"/><div id="post_message_somenumber2"/></root>'

# Run the xpath selection of all matching div's
$xml.selectnodes('//div[@id[starts-with(.,"post_message")]]')

结果:

id
--
post_message_somenumber
post_message_somenumber2

或者,就第一场比赛而言:

# Run the xpath selection of the first matching div
$xml.selectnodes('(//div[@id[starts-with(.,"post_message")]])[1]')

结果:

id
--
post_message_somenumber

答案 2 :(得分:1)

@FindBy(xpath = "//div[starts-with(@id,'expiredUserDetails') and contains(text(), 'Details')]") 
private WebElementFacade ListOfExpiredUsersDetails;

此页面列出了页面上所有共享ID为expiredUserDetails的元素,并且还包含文字或元素Details