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)
当您可以在单个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选择器中的,它将返回紧随其后的元素(例如,下一个兄弟元素)。当然,我正在假设下一个元素始终是您想要的。