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 的构建方式不同。例如在一本书中它是
- 第 1 章 pdf:
...-ch1.pdf
(包含所有子章)
- 第 1-1 章 pdf:
...-ch1-1.pdf
- 第 2 章 pdf:
...-923df2.pdf
- 第 3 章 pdf:
...-ch3.pdf
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
我想删除一个 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 的构建方式不同。例如在一本书中它是
- 第 1 章 pdf:
...-ch1.pdf
(包含所有子章)- 第 1-1 章 pdf:
...-ch1-1.pdf
- 第 1-1 章 pdf:
- 第 2 章 pdf:
...-923df2.pdf
- 第 3 章 pdf:
...-ch3.pdf
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