2011-05-22 63 views
0

我被卡住不能不規則地解析嵌入的html標籤。有沒有辦法從節點中刪除所有html標籤並保留所有文本?使用Nokogiri解析內部標籤

我正在使用的代碼:

rows = doc.search('//table[@id="table_1"]/tbody/tr') 

details = rows.collect do |row| 
    detail = {} 
    [ 
    [:word, 'td[1]/text()'], 
    [:meaning, 'td[6]/font'], 
    ].collect do |name, xpath| 
     detail[name] = row.at_xpath(xpath).to_s.strip 
    end 
    detail 
end 

使用XPath:

[:meaning, 'td[6]/font'] 

產生

:meaning: ! '<font size="3">asking for information specifying <font 
    color="#CC0000" size="3">what is your name?</font> /what/ as in, <font color="#CC0000" size="3">I'm not sure what you mean</font> 
    /what/ as in <a style="text-decoration: none;" href="http://somesecretlink.com">what</a></font> 

在另一方面,使用XPath:

'td/font/text()' 

生成

:meaning: asking for information specifying 

從而忽略了節點的所有子。我想達到的是這

:meaning: asking for information specifying what is your name? /what/ as in, I'm not sure what you mean /what/ as in what? I can't hear you 
+0

我不明白哪來的第一個字體標記被關閉。你試過('td/font')。text? – Roman 2011-05-22 22:15:20

+0

Roman,我糾正了輸出。它確實生成關閉字體標籤。 – PunjCoder 2011-05-22 22:36:07

+0

好吧,你是否嘗試做row.at_xpath('td [6]/font').text? – Roman 2011-05-22 22:49:17

回答

0

這取決於你需要提取什麼。如果你想在字體元素的所有文字,你可以用下面的XPath做到這一點:

'td/font//text()' 

它提取的字體標記所有文本節點。如果你想小區內所有文本節點,則:

'td//text()' 

您也可以撥打引入nokogiri節點上text方法:

row.at_xpath(xpath).text 
+0

謝謝馬克。首先,'.text'引發錯誤,因爲第一個解析的行是空的。我做了'rows.each_with_index.collect'而不是'rows.collect'並跳過了第一行。而ta-da!謝謝! – PunjCoder 2011-05-23 01:35:52