0

ファイルにアップロードするファイルに基づいて、サイトの応答を抽出してアップロードしようとしています。サイトには以下のフォームがあります。

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
  </head>
  <body>
     <form method="POST" action="http://somewebsite.com/imgdigest" enctype="multipart/form-data">
        quality:<input type="text" name="quality" value="2"><br>
        category:<input type="text" name="category" value="1"><br>
        debug:<input type="text" name="debug" value="1"><br>
        image:<input type="file" name="image"><br>
        <input type="submit" value="Submit">
     </form>
  </body>
</html>

私がやりたいことは、ファイルをアップロードし、フォームを送信して応答を抽出することです。

例を見ることから始めました。アップロード作業に成功したと思います。これを実行したときにエラーが発生しなかったためです。

import urllib2_file
import urllib2
import request
import lxml.html as lh

data = {'name': 'image',
        'file':  open('/user/mydir/21T03NAPE7L._AA75_.jpg')
       }
urllib2.urlopen('http://localhost/imgdigestertest.html', data)

残念ながら、私はここで応答を返すためのリクエストを行っていません。私はその応答をどのようにすればよいかわかりません。応答を取得したら、快適なパターン マッチでデータを抽出できるはずです。

提供された回答に基づいて、次のコードを試しました。

import requests

url = 'http://somesite.com:61235/imgdigest'
files = {'file': ('21e1LOPiuyL._SL160_AA115_.jpg', 
                  open('/usr/local/21e1LOPiuyL._SL160_AA115_.jpg', 'rb'))}
other_fields = {"quality": "2",
                "category": "1",
                "debug": "0"
               }
headers={'content-type': 'text/html; charset=ISO-8859-1'}

response = requests.post(url, data=other_fields, files=files, headers=headers)

print response.text

現在、次のエラーが表示されます。これは、画像ファイルが正しく添付されていないことを示しています。ファイルの種類を指定する必要はありますか?

Image::Image(...): bufSize = 0.  Can not load image data. Image size = 0.   DigestServiceProvider.hpp::Handle(...) | 
4

1 に答える 1

2

requests ライブラリ ( pip install requests、pip を使用する場合) を使用します。

例については、こちらを参照してください: http://docs.python-requests.org/en/latest/user/quickstart/#post-a-multipart-encoded-file

それをあなたのようにカスタマイズするには:

import requests
url = 'http://localhost:8080/test_meth'
files = {'file': ('21T03NAPE7L._AA75_.jpg', 
                  open('./text.data', 'rb'))}
other_fields = {"quality": "2",
                "category": "1",
                "debug": "1"
               }
response = requests.post(url, data=other_fields, files=files)
print response.text

私のローカル システムでは、text.data には次のものが含まれています。

Data in a test file.

上記のクライアントをテストするために、cherrypy (pip install cherrypy) を使用して server.py を作成しました。server.py のソースは次のとおりです。

import cherrypy
class Hello(object):
    def test_meth(self, category, debug, quality, file):
        print "Form values:", category, debug, quality
        print "File name:", file.filename
        print "File data:", file.file.read()
        return "More stuff."
    test_meth.exposed = True
cherrypy.quickstart(Hello())

上記の client.py を実行すると、次のように出力されます。

More stuff.

server.py の例でわかるように、これが返されます。

一方、サーバーは次のように述べています。

Form values: 1 1 2
File name: 21T03NAPE7L._AA75_.jpg
File data: Data in a test file.

127.0.0.1 - - [14/Jul/2012:00:00:35] "POST /test_meth HTTP/1.1" 200 11 "" "python-requests/0.13.3 CPython/2.7.3 Linux/3.2.0-26-generic"

したがって、クライアントがコードに記述されているファイル名と、指定されたローカル ファイルのファイル コンテンツを送信していることがわかります。

指摘しておくべきことの 1 つは、この記事の冒頭で requests ライブラリを使用するように言いました。これは、元の質問でインポートしている urllib リクエストと混同しないでください。

于 2012-07-13T21:23:21.670 に答える