【问题标题】:Reference data using surrounding elements使用周围元素的参考数据
【发布时间】:2014-04-05 04:34:58
【问题描述】:

我想从列表中提取一组数字。列表项由其中的标题标识,并以随机顺序出现。我想(例如在第一个列表项中)将数字 (1,287,498) 分配给包含在同一 <li> 标记 (Russia) 中的标题。

<ul>

<li> 
<h6>Russia</h6> 
<p>Red</p> 
<p>1,287,498</p>
</li>

<li> 
<h6>USA</h6> 
<p>Blue</p>
<p>782,2378,223</p>
</li>

...etc.

</ul>

我想要这样的东西:

russia = 1,287,498

我尝试使用XPath,但没有成功,大概是因为顺序是随机的;它一直分配错误的变量。

【问题讨论】:

  • 那么您是如何使用 XPath 的呢?你得到了所有的&lt;li&gt; 元素吗?并处理那个或其他什么?什么是随机的? &lt;li&gt; 元素的顺序是随机的,还是&lt;li&gt; 中元素的顺序?
  • 抱歉我不够清楚,我的意思是说&lt;li&gt; 元素的顺序是随机的。

标签: ruby nokogiri mechanize watir browser-automation


【解决方案1】:

您可能应该使用 CSS 同级选择器 ~+

doc.at('h6[text()=Russia] ~ p:last').text
#=> "1,287,498"
doc.at('h6[text()=Russia] + p + p').text
#=> "1,287,498"

【讨论】:

    【解决方案2】:
    lis = doc.xpath('//li') # Or however you are getting the right elements
    
    data = Hash[ lis.map{ |li| [li.at('h6').text, li.search('p').last.text] }]
    #=> {
    #=>   "Russia" => "1,287,498",
    #=>   "USA"    => "782,2378,223",
    #=> }
    
    p data["Russia"]
    #=> "1,287,498"
    

    此答案假定带有数字的&lt;p&gt;&lt;li&gt; 中的最后一段。很难知道这是否正确,因为您没有共享完整的文档。

    【讨论】:

    • 太好了,这正是我想要的。我不知道你可以简单地使用last.text
    • @N1ghtshade3 Aye、Node#searchNode#cssNode#xpath 都返回一个 NodeSet,这很像一个数组。
    猜你喜欢
    • 2016-08-08
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多