2013-01-19 222 views
0

我無法弄清楚如何獲取表格單元格的文本(),而不管錨標記是否爲文本的父項。獲取帶有或不帶錨定標記的節點文本()

WITH:

<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 

趕上或者uchwalonaproponowana(公告風趣但是就目前而言,它忽略了a標記文本,除非我做td[7]/a/text(),在這種情況下只有錨的文本「uchwalona」被讀取。

回答

1

使用聯合運算符|應工作:

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

(我想你不會需要[not(ancestor::div)]一部分,如果你不使用雙斜槓)

+0

'(td [7] | td [7]/a)/ text()似乎仍然只捕獲非錨(並且我刪除了[[not(ancestor :: div)]用於測試) – Marcos

+0

謝謝。應用聯合後,這個問題似乎與使用'#at_xpath'而不是'#xpath'有關,請參閱我的答案http://stackoverflow.com/a/14414247/1069375 – Marcos

0

的問題似乎得到解決,當我用row.xpath方法,而不是.at_xpath,這不知何故使聯盟運營商|無效。

因此改變

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

到:

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

這意味着我也有我在其他領域擰幾個XPath表達式|name, xpath|雙,不前過包括爲被忽視。

+0

聯合運算符不是無效的,事實是'at_xpath'返回單個節點,即使有多個匹配。 –