我正在尝试解析网页以从论坛获取帖子.
每条消息的开头都以以下格式开头
<div id="post_message_somenumber">
Run Code Online (Sandbox Code Playgroud)
我只想得到第一个
我xpath='//div[starts-with(@id, '"post_message_')]'在yql 尝试没有成功
我还在学习这个,任何人都有建议
我认为我有一个不需要处理名称空间的解决方案。
这是选择所有匹配的div的一个:
//div[@id[starts-with(.,"post_message")]]
Run Code Online (Sandbox Code Playgroud)
但是您说您只想要“第一个”(我想您是说整个页面中的第一个“命中”吗?)。这是一个轻微的修改,仅选择第一个匹配结果:
(//div[@id[starts-with(.,"post_message")]])[1]
Run Code Online (Sandbox Code Playgroud)
这些使用点表示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")]]')
Run Code Online (Sandbox Code Playgroud)
结果:
id
--
post_message_somenumber
post_message_somenumber2
Run Code Online (Sandbox Code Playgroud)
或者,仅针对第一个比赛:
# Run the xpath selection of the first matching div
$xml.selectnodes('(//div[@id[starts-with(.,"post_message")]])[1]')
Run Code Online (Sandbox Code Playgroud)
结果:
id
--
post_message_somenumber
Run Code Online (Sandbox Code Playgroud)
我
xpath='//div[starts-with(@id, '"post_message_')]'在yql 尝试没有成功我还在学习这个,任何人都有建议
如果问题不是由于许多嵌套撇号和未闭合的双引号,那么最可能的原因(我们只能猜测而不显示XML文档)是使用默认命名空间.
指定默认命名空间中元素的名称是XPath中最常见的FAQ.如果您在SO或Internet上搜索"XPath默认命名空间",您将找到许多具有正确解决方案的源.
通常,必须调用一个特殊方法,将前缀(例如"x:")绑定到默认命名空间.然后,在XPath表达式中,"someName"必须将每个元素名称替换为"x:someName.
这是一个很好的答案,如何在C#中做到这一点.
阅读您的语言/ xpath-engine的文档,了解在特定环境中应该如何进行类似的操作.