0

我正在尝试通过一些场景来学习 Nokogiri,并且现在正在使用它来解析 html 代码。

doc = Nokogiri::HTML($driver.page_source)

在我的代码中,我有多个 div 部分,其中包含一些嵌套的 span 和 div 标签,如下所示:

<div class="class1 class2 class3 class4" style="padding: 4px;" id="_28f331c5-3e42-4944-aa3f-15b68f453a2b"> 
  <span class="class5" style="font-weight: bold; text-decoration: underline;">This is a String Text</span> 
  <div class="class6" dd:contenttype="content_type1" dd:concept="concept1" id="_8c83d6b3-55a1-4e88-b8af-9578bbfdef83">
    <div class="class7"> 
      <div class="class8" dd:contenttype="content_type2" dd:entityid="0" dd:entityversion="0" id="_cb48e502-9d87-451c-a7cf-4df104f21e51"> 
        <div class="class9 class10" dd:btnfloatingstyle="top-right" dd:entitytexttype="resultval" id="_9e48a58b-3f06-4ce1-8a1e-fb7f4c5d1fc0" contenteditable="true"></div> 
      </div> 
    </div>
  </div> 
</div>

<div class="class1 class2 class3 class4" style="padding: 4px;" id="_28f331c5-3e42-4944-aa3f-15b68f453a2b"> 
  <span class="class5" style="font-weight: bold; text-decoration: underline;">New String Text</span> 
  <div class="class6" dd:contenttype="content_type1" dd:concept="concept1" id="_8c83d6b3-55a1-4e88-b8af-9578bbfdef83">
    <div class="class7"> 
      <div class="class8" dd:contenttype="content_type2" dd:entityid="0" dd:entityversion="0" id="_cb48e502-9d87-451c-a7cf-4df104f21e51"> 
        <div class="class9 class10" dd:btnfloatingstyle="top-right" dd:entitytexttype="resultval" id="_9e48a58b-3f06-4ce1-8a1e-fb7f4c5d1fc0" contenteditable="true"></div> 
      </div> 
    </div>
  </div> 
</div>

我正在寻找的是当我将字符串“这是一个字符串文本”作为输入传递给方法时,它应该查看多个 div 部分并返回适当的整个 div 部分及其嵌套跨度和 div。

有没有一种直接的方法可以使用 Nokogiri 或任何其他 API 来实现我想要的,或者我需要编写一个方法来遍历元素、它的父级然后是子级?

如果还有其他我会编写自己的代码来遍历的方法,请提出直接的方法。

4

1 回答 1

1

如果您需要根据其子节点获取节点,则必须使用 xpath-selector 而不是 css-selector。

要获取包含跨度的 div,请执行以下操作:

node = doc.at_xpath('//div[./span[text()="New String Text"]]')

可运行示例:

require 'nokogiri'

html = %q[
<body>
<div class="class1 class2 class3 class4" style="padding: 4px;" id="_28f331c5-3e42-4944-aa3f-15b68f453a2b"> 
  <span class="class5" style="font-weight: bold; text-decoration: underline;">This is a String Text</span> 
  <div class="class6" dd:contenttype="content_type1" dd:concept="concept1" id="_8c83d6b3-55a1-4e88-b8af-9578bbfdef83">
    <div class="class7"> 
      <div class="class8" dd:contenttype="content_type2" dd:entityid="0" dd:entityversion="0" id="_cb48e502-9d87-451c-a7cf-4df104f21e51"> 
        <div class="class9 class10" dd:btnfloatingstyle="top-right" dd:entitytexttype="resultval" id="_9e48a58b-3f06-4ce1-8a1e-fb7f4c5d1fc0" contenteditable="true"></div> 
      </div> 
    </div>
  </div> 
</div>

<div class="class1 class2 class3 class4" style="padding: 4px;" id="_28f331c5-3e42-4944-aa3f-15b68f453a2b"> 
  <span class="class5" style="font-weight: bold; text-decoration: underline;">New String Text</span> 
  <div class="class6" dd:contenttype="content_type1" dd:concept="concept1" id="_8c83d6b3-55a1-4e88-b8af-9578bbfdef83">
    <div class="class7"> 
      <div class="class8" dd:contenttype="content_type2" dd:entityid="0" dd:entityversion="0" id="_cb48e502-9d87-451c-a7cf-4df104f21e51"> 
        <div class="class9 class10" dd:btnfloatingstyle="top-right" dd:entitytexttype="resultval" id="_9e48a58b-3f06-4ce1-8a1e-fb7f4c5d1fc0" contenteditable="true">asdf</div> 
      </div> 
    </div>
  </div> 
</div>
</body>
]

doc = Nokogiri::HTML.parse(html)
puts doc.at_xpath('//div[./span[text()="New String Text"]]').to_html
#=> <div class="class1 class2 class3 class4" style="padding: 4px;" id="_28f331c5-3e42-4944-aa3f-15b68f453a2b"> 
#=>   <span class="class5" style="font-weight: bold; text-decoration: underline;">New String Text</span> 
#=>   <div class="class6" dd:contenttype="content_type1" dd:concept="concept1" id="_8c83d6b3-55a1-4e88-b8af-9578bbfdef83">
#=>     <div class="class7"> 
#=>       <div class="class8" dd:contenttype="content_type2" dd:entityid="0" dd:entityversion="0" id="_cb48e502-9d87-451c-a7cf-4df104f21e51"> 
#=>         <div class="class9 class10" dd:btnfloatingstyle="top-right" dd:entitytexttype="resultval" id="_9e48a58b-3f06-4ce1-8a1e-fb7f4c5d1fc0" contenteditable="true">asdf</div> 
#=>       </div> 
#=>     </div>
#=>   </div> 
#=> </div>
于 2013-08-02T17:24:44.560 回答