我有一個相當長的文本,其中包含一些在HTML標籤內的字符串(主要是h1
和h2
)。我需要完全刪除這些內容,這意味着我需要一種方法來查找包含在特定HTML標記中的文本,然後將這些文本從原始文本中剝離。如何在Ruby中查找和刪除HTML中的字符串?
我試過使用gsub
,但無法弄清楚如何構建正則表達式或有意義的東西。
我有一個相當長的文本,其中包含一些在HTML標籤內的字符串(主要是h1
和h2
)。我需要完全刪除這些內容,這意味着我需要一種方法來查找包含在特定HTML標記中的文本,然後將這些文本從原始文本中剝離。如何在Ruby中查找和刪除HTML中的字符串?
我試過使用gsub
,但無法弄清楚如何構建正則表達式或有意義的東西。
查找和刪除節點很簡單:
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代碼,但它們會非常難看。我寧願保持簡單。
非常棒的建議,非常感謝! –
您不能使用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)
謝謝你,我會試試。但事情是 - 我將如何能夠消除那些發現h1s和h2s並保留其餘文本? –
您應該閱讀'nokogiri'的文檔。你可以操縱解析的HTML,刪除標籤等。 –
我們可以幫助你,當你有一個示例輸入和相應的輸出。 –
奧雅納:謝謝你的回答,但我想任何HTML都是好的 - 只要有一些標題,我們可以剝離。 –