Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何用Ruby解析元素后的HTML文本_Regex_Ruby_Nokogiri - Fatal编程技术网

Regex 如何用Ruby解析元素后的HTML文本

Regex 如何用Ruby解析元素后的HTML文本,regex,ruby,nokogiri,Regex,Ruby,Nokogiri,如何用Ruby解析和分组示例HTML HTML文本: 标题一 不同的内容在这里测试 不同的内容在这里测试 标题二 不同的内容在这里测试 标题三 不同的内容在这里测试 不同的内容在这里测试 不同的内容在这里测试 元素不是嵌套的,我想按标题对它们进行分组。当我找到一个时,我想提取它的文本和它后面的所有内容,直到遇到下一个。最后一个标题没有另一个h2作为分隔符 以下是示例输出: - Heading one "<p>different content in here <a>te

如何用Ruby解析和分组示例HTML

HTML文本:

标题一
不同的内容在这里测试

不同的内容在这里测试

标题二 不同的内容在这里测试

标题三 不同的内容在这里测试

不同的内容在这里测试

不同的内容在这里测试

元素不是嵌套的,我想按标题对它们进行分组。当我找到一个
时,我想提取它的文本和它后面的所有内容,直到遇到下一个
。最后一个标题没有另一个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