Nokogiri,如何删除不必要的 html 内容?
Posted
技术标签:
【中文标题】Nokogiri,如何删除不必要的 html 内容?【英文标题】:Nokogiri, How to remove unnecessary html content? 【发布时间】:2013-07-30 02:38:25 【问题描述】:我对 nokogiri 有意见。假设我有这个 html
<html>
<p>
This is just an example, how to remove the next sentence using nokogiri in Ruby.
Thank you for your help.
<strong> XXXX </strong>
<br/>
<br />
I want to remove all the HTML after the strong XXXX
<br />
<br />
<strong> YYY </strong>
</p>
我怎样才能得到"This is just an example, how to remove the next sentence using nokogiri ... Thank you for your help."
?我不想包含来自 <strong> XXXX
的 HTML,直到它的其余部分。
【问题讨论】:
【参考方案1】:如果您只是想获取文本(我认为您要问的是),那么您可以在 Nokogiri 元素上调用 text 方法。这将返回您“...谢谢您的帮助 XXX 我想删除强 XXXX YYY 之后的所有 HTML”。这是 Nokogiri documentation 的链接,如果有帮助的话 - 它谈到了文本方法。或者您是在谈论试图在标签之后不获取任何文本/html?
【讨论】:
您好,感谢您的回复。我想获得全部内容,但排除其中一些,在我制作的样本中,将那些部分从“XXXX”中排除,直到其余部分。因为他们在我不知道如何削减它。
【参考方案2】:希望您正在寻找以下内容:
require 'nokogiri'
doc = Nokogiri::HTML::Document.parse <<-_HTML_
<p>
This is just an example, how to remove the next sentence using nokogiri in Ruby.
Thank you for your help.
<strong> XXXX </strong>
<br/>
<br />
I want to remove all the HTML after the strong XXXX
<br />
<br />
<strong> YYY </strong>
</p>
_HTML_
puts doc.at('//p/text()[1]').to_s.strip
# >> This is just an example, how to remove the next sentence using nokogiri in Ruby.
# >> Thank you for your help.
现在,如果您想从源 html 本身中删除不需要的 html 内容,那么您可以尝试以下方法:
require 'nokogiri'
doc = Nokogiri::HTML::Document.parse <<-_HTML_
<p>
This is just an example, how to remove the next sentence using nokogiri in Ruby.
Thank you for your help.
<strong> XXXX </strong>
<br/>
<br />
I want to remove all the HTML after the strong XXXX
<br />
<br />
<strong> YYY </strong>
</p>
_HTML_
doc.xpath('//p/* | //p/text()').count # => 10
ndst = doc.search('//p/* | //p/text()')[1..-1]
ndst.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 just an example, how to remove the next sentence using nokogiri in Ruby.
# >> Thank you for your help.
# >> </p></body></html>
【讨论】:
是的,像这样,它是如何工作的?为什么结果不包括“强”部分? @kilua 我使用了 xpath 函数text()
。所以它会拾取所有文本节点。不需要关心哪个文本节点与哪个元素节点打包在一起。这就是text()
的工作原理。因为您对第一个文本感兴趣,所以需要[1]
,就是这样。
问题是,内容不是静态的,它总是在不断变化。但它仍然有“强”的 XXXX 部分,HTML 内容(中间)部分可以变成 1 段以上。所以 text()[n] 不能真正解决问题。有什么方法可以搜索 XXXX 部分并将其删除?谢谢
@kilua 删除什么部分?为什么 ?然后试试puts doc.at('//p/text()[1]').to_s.strip
【参考方案3】:
要具体排除,可以试试
doc.search('//p/text()[not(preceding-sibling::strong)]').text
这表示获取不在strong
之后的所有文本节点。
根据您的输入,这将提取以下内容:
This is just an example, how to remove the next sentence using nokogiri in Ruby.
Thank you for your help.
【讨论】:
以上是关于Nokogiri,如何删除不必要的 html 内容?的主要内容,如果未能解决你的问题,请参考以下文章