Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.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
Ruby 如何使用<;提取文本;br>;分隔符?_Ruby_Parsing_Nokogiri - Fatal编程技术网

Ruby 如何使用<;提取文本;br>;分隔符?

Ruby 如何使用<;提取文本;br>;分隔符?,ruby,parsing,nokogiri,Ruby,Parsing,Nokogiri,如何从该HTML代码中提取: <body> <div class="div1"> <div class="div2"> <div class="div3"> <div class="div3.1"> <h2 class="notopgap">HEADER</h2> <br>DONT WANT THIS TEXT

如何从该HTML代码中提取:

<body>
  <div class="div1">
    <div class="div2">
      <div class="div3">
        <div class="div3.1">
          <h2 class="notopgap">HEADER</h2>
          <br>DONT WANT THIS TEXT
          <br><a href='mailto:info@mylink.pt'>info@mylink.pt</a>
          <br><h2>I WANT THIS TEXT</h2>
          <br>TEXT: WANT THIS
          <br>DONT WANT THIS
          <a name='#lev3'></a>
          <h2>FINALLY I WANT THIS TOO</h2><br>
          <div class="div3.1.1">
            BUNCH OF TEXT ...
和Nokogiri/Ruby一起


我可以在div和其他元素之间进行提取,但是当我想要的文本的每个部分之间没有div,但只有br时,如何进行提取?

首先,您可以使用以下xpath:

doc = Nokogiri::HTML(html)
doc.xpath("//div[@class='div3.1']/h2[not(@class = 'notopgap')]").map(&:text)
它将匹配要提取的两个
标记。提取另一个条目更为复杂。我的xpath功夫在这方面缺乏,因为它与您不想捕获的文本处于同一级别

我可能会回到与文本匹配的问题上

text = doc.xpath("//div[@class='div3.1']").text()
text.scan(/TEXT:(.*)\n/).flatten

我更喜欢保持简单:

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<body>
<div class="div1">
<div class="div2">
<div class="div3">
    <div class="div3.1">
        <h2 class="notopgap">HEADER</h2>
                <br>DONT WANT THIS TEXT
                <br><a href='mailto:info@mylink.pt'>info@mylink.pt</a>
                <br><h2>I WANT THIS TEXT</h2>
                <br>TEXT: WANT THIS
                <br>DONT WANT THIS
                <a name='#lev3'></a>
                <h2>FINALLY I WANT THIS TOO</h2><br>
                    <div class="div3.1.1">
EOT

h2 = doc.search('h2')
h2[1].text                            # => "I WANT THIS TEXT"
doc.search('br')[3].next_sibling.text # => "TEXT: WANT THIS\n                "
h2[2].text                            # => "FINALLY I WANT THIS TOO"
需要“nokogiri”
doc=Nokogiri::HTML(“文本:想要这个\n”
h2[2]。文本#=>“最后我也想要这个”
从这一点上,很容易清理
“TEXT:WANT THIS\n”


我知道我将有多个点击,因此,与其尝试使用XPath获得我想要的位置,一个简单的CSS将找到有问题的标记,然后我可以获取我想要的特定标记,并继续处理。

您想要什么和不想要什么的区别是什么?特别是什么决定了您想要“TEXT:want THIS”但不想要“我不要这个"?区别在于
文本:…直到下一个
!因此您希望文本后面跟一个

,而不是后面跟一个

?您的逻辑一点也不清楚。很好,您提供了示例输入和所需的输出,但您没有清楚地传达某些区域的特殊性以及其他方面rs不是。与你的回答无关:我喜欢你的Gravatar
冗余\:参见“冗余”
;-)@JamWaffles,哈哈,你是第一个注意到的。
require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<body>
<div class="div1">
<div class="div2">
<div class="div3">
    <div class="div3.1">
        <h2 class="notopgap">HEADER</h2>
                <br>DONT WANT THIS TEXT
                <br><a href='mailto:info@mylink.pt'>info@mylink.pt</a>
                <br><h2>I WANT THIS TEXT</h2>
                <br>TEXT: WANT THIS
                <br>DONT WANT THIS
                <a name='#lev3'></a>
                <h2>FINALLY I WANT THIS TOO</h2><br>
                    <div class="div3.1.1">
EOT

h2 = doc.search('h2')
h2[1].text                            # => "I WANT THIS TEXT"
doc.search('br')[3].next_sibling.text # => "TEXT: WANT THIS\n                "
h2[2].text                            # => "FINALLY I WANT THIS TOO"