2015-06-07 75 views
1

我試圖用Nokogiri刮html。 這是html源代碼:用Nokogiri刮:: HTML - 無法從XPATH獲取文本

<span id="J_WlAreaInfo" class="wl-areacon"> 
    <span id="J-From">山東濟南</span> 
    至 
    <span id="J-To"> 
     <span id="J_WlAddressInfo" class="wl-addressinfo" title="全國"> 
      全國 
      <s></s> 
     </span> 
    </span> 
</span> 

我需要得到下面的文字:山東濟南

經過與螢火蟲最短XPATH:

//*[@id="J-From"] 

這裏是我的Ruby代碼:

doc = Nokogiri::HTML(open("http://foo.html"), "UTF-8") 
area = doc.xpath('//*[@id="J-From"]') 
puts area.text 

但是,它什麼也沒有返回。 我在做什麼錯?

+1

也許你可以給我們一個鏈接的網頁?另外,你可以看看最初的頁面源代碼:可能是在頁面加載後在JavaScript中創建'',但Nokogiri沒有看到這樣的東西? – LarsH

+0

你可能想看看在這裏關於打開uri的頂級投票答案http://stackoverflow.com/questions/2572396/nokogiri-open-uri-and-unicode-characters – jvnill

+0

謝謝你們一千次,它是一個JS問題。 – Zoru

回答

2

但是,它什麼也沒有返回。我究竟做錯了什麼?

的XPath()返回一個包含匹配(它實際上所謂的節點集)數組:

require 'nokogiri' 


html = %q{ 
<span id="J_WlAreaInfo" class="wl-areacon"> 
    <span id="J-From">山東濟南</span> 
    至 
    <span id="J-To"> 
     <span id="J_WlAddressInfo" class="wl-addressinfo" title="全國"> 
      全國 
      <s></s> 
     </span> 
    </span> 
</span> 
} 

doc = Nokogiri::HTML(html) 
target_tags = doc.xpath('//*[@id="J-From"]') 

target_tags.each do |target_tag| 
    puts target_tag.text 
end 

--output:-- 
山東濟南 

編輯:實際上,你可以在陣列打電話text(),但它將返回的連接結果數組中的每個匹配的文本 - 這不是我曾經發現有用的 - 但因爲只有一個匹配,你應該應該已經得到結果山東濟南。您的帖子中沒有任何內容表明您沒有得到該結果的原因。

如果你只是想從你的XPath,即第一場比賽一個結果,那麼你可以使用at_xpath()

target_tag = doc.at_xpath('//*[@id="J-From"]') 
puts target_tag.text 

--output:-- 
山東濟南 
+0

我可以重現與OP相同的問題。我也收到一個空白字符串,所以它可能是一個本地機器問題。奇怪的是,nokogiri可以獲得節點,但文本是空白字符串。 – jvnill

+0

@jvnill,證明它! – 7stud

+0

謝謝你的回答,問題出在JavaScript上。 Nokogiri什麼也沒有返回,因爲那裏什麼都沒有。 – Zoru