nokogiri +通过文本机械化CSS选择器

Ell*_*nay 2 ruby parsing mechanize css-selectors nokogiri

我是nokogiri的新手,到目前为止对CSS选择器最熟悉,我正在尝试从表中解析信息,下面是该表的示例以及我正在使用的代码,我被卡在适当的if语句中,例如它似乎返回表的全部内容。

表:

<div class="holder">
  <div class ="row">
   <div class="c1">
     <!-- Content I Don't need -->
   </div>
   <div class="c2">
    <span class="data">
     <!-- Content I Don't Need -->
    <span class="data">
   </div>
 </div>
 ...
 <div class="row">
  <div class="c1">
   SPECIFIC TEXT
  </div>
  <div class="c2">
   <span class="data">
    What I want
   </span>
  </div>
 </div>
</div>
Run Code Online (Sandbox Code Playgroud)

我的脚本:(如果在表中找到SPECIFIC TEXT,则它返回每个“ div.c2 span.data”变量-因此,我已经弄不清楚do循环或if语句的知识了)

data = []
page.agent.get(url)
page.search('div.row').each do |row_data|
 if (row_data.search('div.c1:contains("/SPECIFIC TEXT/")').text.strip
  temp = row_data.search('div.c2 span.data').text.strip
  data << temp
 end
end
Run Code Online (Sandbox Code Playgroud)

Mar*_*mas 5

当您可以在单个CSS选择器中提取所需的内容时,无需停止并插入ruby逻辑。

data = page.search('div.row > div.c1:contains("SPECIFIC TEXT") + div.c2 span.data')
Run Code Online (Sandbox Code Playgroud)

这将仅包括那些与选择器匹配的内容(例如,遵循特定文本)。

这是您的逻辑可能出错的地方:

这段代码

if (row_data.search('div.c1:contains("SPECIFIC TEXT")'...
  temp = row_data.search('div.c2 span.data')...
Run Code Online (Sandbox Code Playgroud)

首先在该行中搜索特定文本,然后如果匹配,则返回与第二个查询匹配的所有行,第二个查询具有相同的起点。关键是+上方的CSS选择器中的,它将返回紧随其后的元素(例如,下一个兄弟元素)。当然,我正在假设下一个元素始终是您想要的。