2014-03-31 22 views
0

我有一個相當長的文本,其中包含一些在HTML標籤內的字符串(主要是h1h2)。我需要完全刪除這些內容,這意味着我需要一種方法來查找包含在特定HTML標記中的文本,然後將這些文本從原始文本中剝離。如何在Ruby中查找和刪除HTML中的字符串?

我試過使用gsub,但無法弄清楚如何構建正則表達式或有意義的東西。

+7

我們可以幫助你,當你有一個示例輸入和相應的輸出。 –

+1

奧雅納:謝謝你的回答,但我想任何HTML都是好的 - 只要有一些標題,我們可以剝離。 –

回答

1

查找和刪除節點很簡單:

require 'nokogiri' 

doc = Nokogiri::HTML(<<EOT) 
<html> 
<body> 
<h1>foo</h1> 
<h2>bar</h2> 
<p>This is some text</p> 
</body> 
</html> 
EOT 

doc.search('h1, h2').remove 
puts doc.to_html 
# >> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
# >> <html><body> 
# >> 
# >> 
# >> <p>This is some text</p> 
# >> </body></html> 

我使用search用CSS選擇器h1, h2它會發現所有<h1><h2>節點並將它們作爲NodeSet返回。 NodeSet就像一個數組; remove只是遍歷該NodeSet並刪除其所有元素。

如果你想看看裏面的節點在他們的文本中,展開代碼一點:

require 'nokogiri' 

doc = Nokogiri::HTML(<<EOT) 
<html> 
<body> 
<h1>foo</h1> 
<h2>bar</h2> 
<h1>baz</h1> 
<p>This is some text</p> 
</body> 
</html> 
EOT 

doc.search('h1, h2').select{ |n| n.text[/\b(?:foo|bar)\b/] }.map(&:remove) 
puts doc.to_html 
# >> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
# >> <html><body> 
# >> 
# >> 
# >> <h1>baz</h1> 
# >> <p>This is some text</p> 
# >> </body></html> 

text返回節點的文本內容。 /\b(?:foo|bar)\b/在該文本中查找單詞"foo""bar"。這會導致數組,因此我無法使用NodeSet的remove方法。相反,我可以將它傳遞到map,它將迭代由select返回的每個節點,並將Nokogiri :: Node.select發送給它。這有點複雜,但到達那裏。

XPath選擇器可以查看節點的文本內部以替換部分Ruby代碼,但它們會非常難看。我寧願保持簡單。

+0

非常棒的建議,非常感謝! –

0

您不能使用regex解析HTML(請參閱「RegEx match open tags except XHTML self-contained tags」)。你可能想看看一個HTML解析寶石像Nokogiri

require 'nokogiri' 

doc = Nokogiri::HTML(my_html) 

h1s = doc.css('h1').map(&:text) 
h2s = doc.css('h2').map(&:text) 
+0

謝謝你,我會試試。但事情是 - 我將如何能夠消除那些發現h1s和h2s並保留其餘文本? –

+0

您應該閱讀'nokogiri'的文檔。你可以操縱解析的HTML,刪除標籤等。 –

相關問題