1

私はこのURLを解析しようとしています:

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

残念ながら、Web サイトにログインするための「標準的な」方法はありません。自動ログインを実行するには、優れた 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
                      })]
                  })]
              })]
          })]
      })]
  })

技術的には、どちらも希望する結果ではありませんが、2 つの異なる理由があります。どのページにいても、元の呼び出しが意図したとおりに機能することはありません。私が示した例は、認証が必要なページで機能します。また、認証とログインが必要なページでは、Mechanize を使用してフォーム ログインを透過的に処理する必要があります。

ただし、投稿したコードと私の修正の違いを自分で理解する必要があります。これは、前進するために絶対に重要だからです。

于 2013-10-15T16:44:03.787 に答える