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."?我不想包含来自 &lt;strong&gt; 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 内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Nokogiri 删除节点?

如何使用Nokogiri从XML中删除元素

如何使用 Nokogiri 解析 HTML 表格?

使用nokogiri剥离样式属性

使用 nokogiri 将内容中的链接替换为 rails 中的已处理链接

使用 Nokogiri 的 XML Builder 添加命名空间