ruby - nokogiri + 通过文本 Mechanize css 选择器

标签 ruby parsing css-selectors nokogiri mechanize

我是 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>

我的脚本:(如果在表中找到 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

最佳答案

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

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

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

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

这段代码

if (row_data.search('div.c1:contains("SPECIFIC TEXT")'...
  temp = row_data.search('div.c2 span.data')...

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

关于ruby - nokogiri + 通过文本 Mechanize css 选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21856799/

相关文章:

ruby-on-rails - 如何找到数组中最后一项的索引?

arrays - 使用带有 %w 或 %W 的变量 - Ruby

algorithm - 具有优先级的方程(表达式)解析器?

xpath - 关闭Google翻译中的弹出框

selenium - 如何通过不使用 :not()? 选择没有类的元素

ruby-on-rails - 通过字符串值查找多维数组中数组的索引

ruby - MongoDB:什么是连接池和超时?

perl - 解析 html 文件以便稍后将其输入数据库的最简单方法是什么?

python - 在 python 中,我需要将 html 页面源的一个元素存储为字符串。我怎样才能做到这一点?

css - 如果我总是使用 CSS Class 而不是 CSS ID 来处理所有内容,有什么优点和缺点吗?