获取带或不带锚标记的节点text()

时间:2013-01-19 11:20:23

标签: ruby xml xpath nokogiri

我无法弄清楚如何获取表格单元格的text(),无论锚标记是否为文本的父级。

使用:

    <td class="c divComms" title="Komentarz|"> 
<a id="List1_Dividends_ctl01_HyperLink1" target="_blank" href="http://www.attrader.pl/pl/akcje/DRUKPAK/komunikat/EBI/none,20130104_090845_0000041461">uchwalona</a> 
<div class="stcm">2013-01-29</div></td>

WITHOUT:

<td class="c divComms" title="Komentarz|Celem...">
proponowana
<div class="stcm">2012-10-05</div>
</td>

组合哈希的元素,我希望

 details = rows.collect do |row|
  detail = {}
  [
     [:paystatus, 'td[7]//text()[not(ancestor::div)]'],
     [:paydate, 'td[7]/div/text()'], # the 2013-01-29 or 2012-10-05 above
  ].each do |name, xpath|
    detail[name] = row.at_xpath(xpath).to_s.strip
  end

捕获 uchwalona proponowana (在尾随div中没有​​日期的通知),但就目前而言,它会忽略a标记文本,除非我做td[7]/a/text(),在这种情况下会读取主播的文字“uchwalona”。

2 个答案:

答案 0 :(得分:1)

使用union运算符|应该工作:

[:paystatus, '(td[7]|td[7]/a)/text()']

(如果您不使用双斜杠,我认为您不需要[not(ancestor::div)]部分)

答案 1 :(得分:0)

当我使用row.xpath方法而不是.at_xpath时,问题似乎得到了解决,这种方式使联合运算符 | 无效。

如此改变

  detail[name] = row.at_xpath(xpath).to_s.strip

为:

  detail[name] = row.xpath(xpath).to_s.strip

这意味着我还必须在我的其他字段|name, xpath|对中收紧一些xpath表达式,以免过度包含,因为之前没有注意到。