1

我正在尝试解析这个网址:

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">

对于其他网页,我没有这个问题。

错误在哪里?

4

2 回答 2

2

您的查询产生空结果,因为您尝试访问的页面需要身份验证。如果您检查网络流,您将看到您得到一个空响应。如果您通过在浏览器中粘贴 URL 来重复该步骤,您将很快被重定向到一个错误页面,该页面的消息很好地提示了缺少身份验证:

Su sesión ha caducado

Para seguir utilizando estas páginas debe volver a la página inicial y continuar normalmente

不幸的是,没有登录网站的“标准”方式。为了执行自动登录,您应该寻找一些与伟大的 Mechanize Python 库等效的 Ruby。

于 2013-10-15T16:52:40.773 回答
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 透明地处理表单登录。

但是,您确实需要自己了解您发布的代码与我的修复之间的区别,因为这对于前进绝对至关重要。

于 2013-10-15T16:44:03.787 回答