Regex 如何用Ruby解析元素后的HTML文本
如何用Ruby解析和分组示例HTML HTML文本:Regex 如何用Ruby解析元素后的HTML文本,regex,ruby,nokogiri,Regex,Ruby,Nokogiri,如何用Ruby解析和分组示例HTML HTML文本: 标题一 不同的内容在这里测试 不同的内容在这里测试 标题二 不同的内容在这里测试 标题三 不同的内容在这里测试 不同的内容在这里测试 不同的内容在这里测试 元素不是嵌套的,我想按标题对它们进行分组。当我找到一个时,我想提取它的文本和它后面的所有内容,直到遇到下一个。最后一个标题没有另一个h2作为分隔符 以下是示例输出: - Heading one "<p>different content in here <a>te
标题一
不同的内容在这里测试
不同的内容在这里测试
标题二
不同的内容在这里测试
标题三
不同的内容在这里测试
不同的内容在这里测试
不同的内容在这里测试
元素不是嵌套的,我想按标题对它们进行分组。当我找到一个
时,我想提取它的文本和它后面的所有内容,直到遇到下一个
。最后一个标题没有另一个h2作为分隔符
以下是示例输出:
- Heading one
"<p>different content in here <a>test</a> <b>test</b></p>
<p>different content in here <a>test</a> <b>test</b></p>"
- Heading 2
"<p>different content in here <a>test</a> <b>test</b></p>"
-标题一
“此处测试的内容不同
这里的不同内容测试测试“
-标题2
“此处的不同内容测试测试”
您无需使用正则表达式解析HTML,即可快速完成此操作
您将能够获取h2
元素,然后提取其中的内容
一些例子在这应该行得通,第1组包含标题文本, 第2组包含主体 包括空格修剪
/\s*([\s\s]*?)\s*\s*([\s\s]*?)(?=\s*\s*$)/
可读正则表达式
<h2 \s* >
\s*
( [\S\s]*? ) # (1) Heading
\s*
</h2 \s* >
\s*
( [\S\s]*? ) # (2) Body
(?= \s* <h2 \s* > | \s* $ )
\s*
([\S\S]*?)#(1)标题
\s*
\s*
([\S\S]*?)#(2)正文
(?=\s*\s*$)
您试图做的事情是非常不鼓励的,而“”有助于解释原因。只有在您拥有代码生成的最简单的情况下,才应该使用模式。如果您不拥有生成器,那么HTML中的任何更改都可能破坏您的代码,通常是无法修复的,尤其是在深夜,在一次严重停机期间,您的老板会督促您立即运行它
使用Nokogiri,这将使您以一种更稳健和推荐的方式进入球场。此示例仅收集h2
和后面的p
节点。弄清楚如何显示它们只是一个练习
require 'nokogiri'
html = <<EOT
<h2>heading 1</h2>
<p>content 1a<b>test</b></p>
<p>content 1b</p>
<h2>heading 2</h2>
<p>content 2a</p>
EOT
doc = Nokogiri::HTML.parse(html)
output = doc.search('h2').map { |h|
next_node = h.next_sibling
break unless next_node
paragraphs = []
loop do
case
when next_node.text? && next_node.blank?
when next_node.name == 'p'
paragraphs << next_node
else
break
end
next_node = next_node.next_sibling
break unless next_node
end
[h, paragraphs]
}
代码还对HTML的格式做了一些假设,但如果格式发生变化,代码不会抛出垃圾。它采用如下格式:
<h2>
<p>
...
这是必要的,因为HTML不需要格式化,但当它存在时,插入的“文本”节点只包含空格,这会导致我们预期的“漂亮HTML”缩进。解析器和浏览器不关心它是否存在,除非是预格式化文本,只有人类关心。实际上,最好不要使用它们,因为它们会使文件膨胀并减慢文件的传输速度。但人们对这种方式很挑剔。实际上,代码中的HTML示例看起来更像:
<h2>heading 1</h2>\n<p>content 1a<b>test</b></p>\n<p>content 1b</p>\n\n<h2>heading 2</h2>\n<p>content 2a</p>\n
标题1\ncontent 1atest\ncontent 1b\n\n标题2\ncontent 2a\n
而
when
语句忽略了那些“\n
”节点。您链接的帖子实际上并没有解释任何内容。在我的阅读中,它有一些非常好的观点,说明了为什么正则表达式失败,何时可以使用它,以及为什么解析器更健壮。也许链接应该指向问题本身,这样我就可以调整它,否则我会发现它是一个有用的页面,有很好的讨论。FWIW,Nokogiri不是一个标准;它只是一个图书馆。这可能是一个非常受欢迎的库,但受欢迎并不能使某个东西成为“标准”;它只是使它变得流行。除了你的评论,我在页面上的任何地方都看不到“标准”这个词。Nokogiri是Ruby中最流行(事实上)的解析器,也是OP使用的标记。我不确定这条评论是关于什么的。你在作品下面那次骇人听闻的(现已删除)对话中的一条评论中做出了这一断言。
when next_node.text? && next_node.blank?
<h2>heading 1</h2>\n<p>content 1a<b>test</b></p>\n<p>content 1b</p>\n\n<h2>heading 2</h2>\n<p>content 2a</p>\n