1

我试图解析这个网址空的HTML:与引入nokogiri

http://abantia.cvtools.com/persona/Oferta.mostrar.php?idofe=140544&no_links=true 

我粘贴控制台结果:

uri = "http://abantia.cvtools.com/persona/Oferta.mostrar.php?idofe=140544&no_links=true" 

n = Nokogiri::HTML(uri) 
=> #<Nokogiri::HTML::Document:0x65af7b6 name="document" children=[#<Nokogiri::XML::DTD:0x65af04a name="html">, #<Nokogiri::XML::Element:0x65adf56 name="html" children=[#<Nokogiri::XML::Element:0x64f98e4 name="body" children=[#<Nokogiri::XML::Element:0x64f96aa name="p" children=[#<Nokogiri::XML::Text:0x64f951a "http://abantia.cvtools.com/persona/WebLinkEntryPoint.php?idowner=36054&code=DetalleOferta&idofe=140544&no_links=true">]>]>]>]> 
irb(main):115:0> n.css("#contenido") 
=> [] 
irb(main):119:0> n.css("title") 
=> [] 

我得到一个空的HTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 

随着其他网页我没有这个问题。

错误在哪里?

+0

您是否可以直接在浏览器中访问网址?当我这样做时,我的会话过期了。除非您提供有效的链接,否则不可能重现。 – Bala

+0

此页面需要登录,这是问题所在。谢谢! – hyperrjas

回答

1

试试这个:

require 'open-uri' 
    n = Nokogiri::HTML(open(uri)) 

在原来的通话,你解析URL作为一个字符串....但你需要为引入nokogiri

取出并打开该URL的内容为了详细说明的意见,这是原来的通话检索的内容:

Nokogiri::HTML(uri) 
=> #(Document:0x3fe9fdc3a2e0 { 
    name = "document", 
    children = [ 
    #(DTD:0x3fe9fdc3b4c4 { name = "html" }), 
    #(Element:0x3fe9fdc40488 { 
     name = "html", 
     children = [ 
     #(Element:0x3fe9fdc45974 { 
      name = "body", 
      children = [ 
      #(Element:0x3fe9fdc475bc { 
       name = "p", 
       children = [ 
       #(Text "http://abantia.cvtools.com/persona/Oferta.mostrar.php?idofe=140544&no_links=true")] 
       })] 
      })] 
     })] 
    }) 

这里是我的版本,与open呼叫

Nokogiri::HTML(open(uri)) 
=> #(Document:0x3fe9fe012980 { 
    name = "document", 
    children = [ 
    #(DTD:0x3fe9fe0162b0 { name = "html" }), 
    #(Element:0x3fe9fe0153ec { 
     name = "html", 
     children = [ 
     #(Element:0x3fe9fdc21470 { 
      name = "body", 
      children = [ 
      #(Element:0x3fe9fdc2087c { 
       name = "header", 
       children = [ 
       #(Element:0x3fe9fdc23838 { 
        name = "meta", 
        attributes = [ 
        #(Attr:0x3fe9fdc22f50 { 
         name = "http-equiv", 
         value = "Refresh" 
         }), 
        #(Attr:0x3fe9fdc22f28 { 
         name = "content", 
         value = "0; URL=Session.timeout.php?log=0&referer=%2Fperso 
         })] 
        })] 
       })] 
      })] 
     })] 
    }) 

从技术上讲,它们都不是你想要的结果,而是出于两个不同的原因。无论您在哪个网页上,您的原始电话都无法按预期工作。我给你的例子将在需要认证的页面上工作。对于需要认证和登录的页面,您希望使用Mechanize来透明地处理表单登录。

但是,您真的需要了解您所发布的代码与我的修复之间的差异,因为这对于前进至关重要。

+0

我收到了同样的结果。此修补程序不适用于我。与其他网页nokogiri确实为我工作得很好。 – hyperrjas

+0

好的,我不知道你的其他例子使用了什么代码,但我可以很明确地告诉你,除非你用猴子修补了Nokogiri,否则上面使用的代码将不适用于任何东西,因为Nokogiri :: HTML需要一个String,你给它一个字符串,它试图解析。您在我的示例中遇到的错误与身份验证的不同问题有关 –

+0

谢谢!你的回应是最好的! – hyperrjas

2

您的查询会产生空的结果,因为您尝试访问的页面需要验证。如果你检查网络流量,你会看到你得到一个空的答复。 如果重复步骤通过在浏览器中粘贴URL,你很快就会重定向到其消息是关于失踪认证很好的提示一个错误页面:

苏使sesion公顷caducado

帕拉seguir utilizando estaspáginas德贝御宇一拉páginainicialŸ continuar normalmente

遗憾的是,登录到网站没有 “标准” 的方式。为了执行自动登录,你应该寻找一些与巨大的机械化Python库相当的Ruby。

+0

谢谢你,你的回应是好的:) – hyperrjas