【问题标题】:Trouble using Xpath "starts with" to parse xhtml使用 Xpath“开始于”解析 xhtml 时遇到问题
【发布时间】:2011-02-01 03:51:27
【问题描述】:

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

<div id="post_message_somenumber">

我只想拿到第一个

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

【问题讨论】:

  • 好问题,+1。有关问题的两个可能原因和解决方案,请参阅我的答案。
  • 问题在于引号和(可能是次要的)id 的值(它不是以双引号开头)。你想要xpath='//div[starts-with(@id, "post_message_")]'
  • 我不知道 yql 是什么,但我怀疑问题在于如何编写包含引号的 XPath 表达式,然后将其嵌入或转义到宿主语言环境中。
  • 感谢您的回复。 Salathe,你的建议奏效了。 YQL 是 yahoo 查询语言,与 yahoo 管道一起,对于不懂编程的人来说是学习如何解析网页、组合 rss 提要等的好方法。

标签: xpath yql


【解决方案1】:

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

这是一个选择所有匹配的 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】:

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

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

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

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

    这是一个good answer how to do this in C#

    阅读您的语言/xpath 引擎的文档,应该如何在您的特定环境中完成类似的操作。

    【讨论】:

      【解决方案3】:
      @FindBy(xpath = "//div[starts-with(@id,'expiredUserDetails') and contains(text(), 'Details')]") 
      private WebElementFacade ListOfExpiredUsersDetails;
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-26
        • 2011-06-26
        • 2017-04-21
        • 2014-06-09
        • 1970-01-01
        • 2018-04-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多