Ruby,Nokogiri 移除 <ul> 个被 <class="foo"> 选择的元素

Ruby, Nokogiri Remove <ul> element selected by <class="foo">

我想删除一个 Nokogiri 节点,但我不明白。

我得到了这样的 HTML 代码:

<div class="metis manual-toogle" id="tocList">...
  <li id="tocElement-ebook_cs_1111111_11">...
    <a data-content href="url" class=" "></a> <!-- only this urls I want -->
      <ul class="foo">
        <!-- the following content and urls I want to remove -->
        <li class id="tocElement-ebook_cs_1111111_cs12">
          <a data-content href="url" class=" "></a>
          ...
          <a data-content href="url" class=" "></a>
        </li>
      </ul>
  </li>
</div>

到目前为止我尝试过的:

document = Nokogiri::HTML.parse(html_input)
document.xpath('//ul[@class="foo"]').each {|x| x.remove}

document.xpath('//ul[@class="foo"]').children.map(:&remove)

我做错了什么?

编辑:

我不想解析某些 URL。我得到了上面的 html 结构。我想要的 URL 在 <li></li> 块中嵌套,如 <a data-content href="url"></a>。问题是,<ul></ul> 里面也有一个 <a data-content href="url"></a>。我可以提取每个 URL,但只需要主要的 URL。

这本书有一些章节,我可以下载第一章link。每个子章节(在 <ul> 内)都有自己的 pdf。

我不能使用正则表达式,因为 link 的构建方式不同。例如在一本书中它是

HTML-代码一团糟。最简单的方法是删除 <ul> 块本身。

您没有在此处提供太多上下文或细节。但是,如果您选择正确,下面的代码应该删除您想要的项目。请提供更多详细信息,例如您收到的输出、预期的输出等。

鉴于信息有限,您可以尝试一下:

更新:

html.html

<div class="metis manual-toogle" id="tocList">...
  <li id="tocElement-ebook_cs_1111111_11">...
    <a data-content href="url" class=" "></a> <!-- only this urls I want -->
      <ul class="foo">
        <!-- the following content and urls I want to remove -->
        <li class id="tocElement-ebook_cs_1111111_cs12">
          <a data-content href="url" class=" "></a>
          ...
          <a data-content href="url" class=" "></a>
        </li>
      </ul>
  </li>
</div>

main.rb

require 'nokogiri'
require 'open-uri'
require 'pry'

doc = Nokogiri::HTML(open('html.html'))

doc.xpath('//ul[@class="foo"]').remove

doc.xpath('//a').each do |item|
puts item
end

输出:

~/code/projects/test ⌚ 8:28:32
$ ruby main.rb                                                                                                                                                                                                          ‹2.6.1›
<a data-content href="urliwant" class=" "></a>

我们通过聊天解决了这个问题。以上示例有效。但是,对于他的具体情况,我们需要这样做,因为 html:

document = Nokogiri::HTML(open('html.html'))

document.css('//ul//ul//ul').remove
document.css('ul .collapse').remove

links = document.xpath('//*[@id="toc"]//ul')

File.open("input.html", "a") do |output_txt|
  links.each do |item|
    output_txt.write(item)
  end
end