Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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
Html 如何使用Nokogiri使用CSS选择器逐行解析?_Html_Ruby_Parsing_Nokogiri_Mechanize - Fatal编程技术网

Html 如何使用Nokogiri使用CSS选择器逐行解析?

Html 如何使用Nokogiri使用CSS选择器逐行解析?,html,ruby,parsing,nokogiri,mechanize,Html,Ruby,Parsing,Nokogiri,Mechanize,我有一个要解析的HTML表。我想向下移动每个并提取href。 HTML如下所示: table id="classified_table" class="vs-classified-table widget-off top" cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td id="classified_cell"> <table class="v

我有一个要解析的HTML表。我想向下移动每个并提取href。 HTML如下所示:

table id="classified_table" class="vs-classified-table widget-off top" cellspacing="0" cellpadding="0" border="0">
    <tbody>
    <tr>
    <td id="classified_cell">
    <table class="vs-classified-table widget-off" cellspacing="0" cellpadding="0" border="0">
    <tbody>
    <tr id="vs_classified_73634384" class="classified row1 kiwii-clad-row kiwii-clad-featured">
    <tr id="vs_classified_74530668" class="classified row2 kiwii-clad-row kiwii-clad-featured">
    <tr id="vs_classified_62296263" class="classified row3 kiwii-clad-row kiwii-clad-featured">
    <tr id="vs_classified_62468547" class="classified row4 kiwii-clad-row kiwii-clad-featured">
    <tr id="vs_classified_47122034" class="classified row5 kiwii-clad-row kiwii-clad-featured">
    <tr id="vs_classified_78210646" class="classified row6 kiwii-clad-row">
    <tr id="vs_classified_78207083" class="classified row7 kiwii-clad-row">
    <tr id="vs_classified_69104369" class="classified row8 kiwii-clad-row">
    <tr id="vs_classified_78113204" class="classified row9 kiwii-clad-row">
    <tr id="vs_classified_52761813" class="classified row10 kiwii-clad-row">
    <tr id="vs_classified_78121746" class="classified row11 kiwii-clad-row">
    <tr id="vs_classified_76515548" class="classified row12 kiwii-clad-row">
    <tr id="vs_advert_middle" class="vs-advertisement advertisment-middle-2 vs-adsense-middle-BR-" style="border:none">
    <tr id="vs_classified_34048811" class="classified row13 kiwii-clad-row">
require 'rubygems'
require 'nokogiri'
require 'open-uri'

page = Nokogiri::HTML(open('http://servico-informatica.vivanuncios.com/computador+rio-de-janeiro-capital/'))
rows = page.css('tr#vs_classified_73634384.classified td.summary div a#vs-detail-link-1.kiwii-clear-none')
puts rows.text
#this works

rows [1..10].each do |row|
    puts "this isn't working :("

end
第一次打印成功地打印了第一次打印的文本,但每个循环中的puts不起作用


我正在努力抓取的页面是:

我不知道您希望它做什么:

rows [1..10].each do |row|
  puts "this isn't working :("
end
但我很确定它不会像你期望的那样。这实际上被解释为:

rows[1..10].each { ... }
由于作为Nokogiri::XML::NodeSet的行只有一个条目,尝试从1开始会得到一个空值;这意味着你实际上只是在说:

some_empty_node_set.each { ... }
这没有任何用处。但是,如果您查看行中的第一个条目,您会发现您要查找的href:

rows[0]['href']
# "http://servico-informatica.vivanuncios.com/..."

您还可以查看rows.attr'href'或rows.first['href'],具体取决于口味和适合您的需要。

您只收到一个结果,因为您的css查询正在使用,这意味着它正在页面上查找唯一的元素

因此,您需要修改查询以根据css类查找href

tr.classified td.summary a.classified-link
更新

上面的css路径将获取所有链接,然后您只需遍历数组并使用href和文本执行所需操作

require 'rubygems'
require 'nokogiri'
require 'open-uri'

page = Nokogiri::HTML(open('http://servico-informatica.vivanuncios.com/computador+rio-de-janeiro-capital/'))
links = page.css("tr.classified td.summary a.classified-link")

links.map do |link|
  puts link['href']
  puts link.content
end

事实上,nokogiri并不关心规范。如果有两个元素具有相同的id,css将同时返回这两个元素。很公平,它仍然只获取一个元素,因为页面正在创建唯一的id'sso,那么最好的方法是什么?指向tbody,然后创建另一个指向TR的变量,然后循环?我想遍历每个TR并删除文本和链接。指向Nokogiri的最佳方式是什么?在Tbody?你能告诉我怎么做吗?这不起作用只是为了确保我的代码在那之前一直在运行。你对我尝试做什么的猜测并不遥远:我尝试获取文本,以及每个条目的href。你能告诉我用CSS路径选择什么吗?你能举个例子说明你在输出方面想要什么吗?比如你想要一个只包含链接的数组吗?你想要链接中的文本吗?等等。您的HTML示例无效且缺少HREF,并且您尚未指定链接中您感兴趣的HREF。