2012-03-09 60 views
3

有沒有更好的方法來提取使用Nokogiri的網頁上的可見文本?目前我使用inner_text方法,但是該方法將很多JavaScript視爲可見文本。我想要捕捉的唯一文本是屏幕上的可見文本。Nokogiri只抓取可見inner_text

例如,在內部評級法,如果我做的Ruby的1.9.2-P290如下:

require 'nokogiri' 
require 'open-uri' 
doc = Nokogiri::HTML(open("http://www.bodybuilding.com/store/catalog/new-products.jsp?addFacet=REF_BRAND:BRAND_MET_RX")) 
words = doc.inner_text 
words.scan(/\w+/) 

如果我搜索單詞「功能」我看到它出現20次在列表中,但是如果我去http://www.bodybuilding.com/store/catalog/new-products.jsp?addFacet=REF_BRAND:BRAND_MET_RX,「功能」一詞不會出現在可見文本的任何地方。

我可以忽略JavaScript還是有更好的方法來做到這一點?

回答

3

你可以嘗試:

require 'nokogiri' 
require 'open-uri' 

doc = Nokogiri::HTML(open("http://www.bodybuilding.com/store/catalog/new-products.jsp?addFacet=REF_BRAND:BRAND_MET_RX")) 

doc.traverse{ |x| 
    if x.text? && x.text !~ /^\s*$/ 
     puts x.text 
    end 
} 

我沒有做太多與引入nokogiri,但我相信這應該找到文檔中沒有空格/輸出的所有文本節點。這似乎至少忽略了javascript,我查看的所有文本都可以在頁面上看到(儘管其中的一些在下拉菜單中)。

+0

太棒了!這工作好多了,謝謝! – akaDanPaul 2012-03-13 00:41:56

+0

這有效,但你應該在條件中避免使用'和',因爲它是用於控制流的,並且具有與預期的&&操作符不同的操作順序。另外,還有一個'!〜'運算符可以用來代替'not =〜' – Ben 2017-06-02 21:51:13

1

你可以忽略JavaScript並有更好的方法。你忽略了Nokogiri的力量。厲害。

與其給你提供直接的答案,它會幫助你學會使用Nokogiri「釣魚」。

在這樣一個文件:

<html> 
    <body> 
    <p>foo</p> 
    <p>bar</p> 
    </body> 
</html> 

我建議用CSS存取開始,因爲他們是一般人更熟悉:

  • doc = Nokogiri::HTML(var_containing_html)將解析和doc返回HTML DOM。
  • doc.at('p')將返回一個節點,它基本上指向第一個節點<p>
  • doc.search('p')將返回所有匹配節點的NodeSet,它的作用類似於一個數組,在這種情況下,所有節點都是<p>
  • doc.at('p').text將返回節點內的文本。
  • doc.search('p').map{ |n| n.text }將返回<p>節點中的所有文本作爲文本字符串數組。

隨着文檔變得越來越複雜,您需要深入研究。有時你可以使用CSS訪問器來完成,比如'body p'或類似的東西,有時你需要使用XPath。我不會去那些,但有很好的教程和參考。

Nokogiri's tutorials非常好。通過他們,他們會揭示你需要知道的一切。

另外,Stack Overflow上有很多關於這類問題的答案。查看頁面右側的「相關」鏈接。

+0

好的答案,數組映射函數一定會對我以後再次有用 – abcde123483 2013-03-29 13:10:14

+1

這個答案是關閉主題,問題是抓住整個頁面的可見內部文本,而不是一堆元素。即使使用'body',OP也無法擺脫'javascript'標籤。 – sidney 2014-10-20 09:47:27

+0

Off topic?幾乎不。 OP沒有正確使用Nokogiri,而是試圖找到所需的節點,而不是試圖對所有文本進行全面獲取,並最終以JavaScript爲文本。相反,通過有選擇性地選擇所需的節點,實際顯示的節點,可以提取屏幕上的文本而不會產生任何垃圾。 OP希望有一個「更好的方式來做到這一點」,這涉及到如何正確提取數據,這就是答案所提供的。您的評論只能證明我的觀點。 – 2014-10-20 13:57:46