我正在尝试解析网页以从论坛获取帖子 每条消息的开头都以以下格式开头
<div id="post_message_somenumber">
我只想获得第一个
我在yql中尝试了xpath='//div[starts-with(@id, '"post_message_')]'
但没有成功
我还在学习这个,有人有建议
答案 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