35

Web サイトからデータを取得しようとしています。しかし、それは私を返しますincomplete read。取得しようとしているデータは、ネストされたリンクの膨大なセットです。私はオンラインでいくつかの調査を行い、これはサーバーエラーが原因である可能性があることを発見しました (予想サイズに達する前にチャンク転送エンコーディングが終了しました)。このリンクで上記の回避策も見つけました

ただし、これを私の場合にどのように使用するかについてはわかりません。以下は私が取り組んでいるコードです

br = mechanize.Browser()
br.addheaders = [('User-agent', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1;Trident/5.0)')]
urls = "http://shop.o2.co.uk/mobile_phones/Pay_Monthly/smartphone/all_brands"
page = urllib2.urlopen(urls).read()
soup = BeautifulSoup(page)
links = soup.findAll('img',url=True)

for tag in links:
    name = tag['alt']
    tag['url'] = urlparse.urljoin(urls, tag['url'])
    r = br.open(tag['url'])
    page_child = br.response().read()
    soup_child = BeautifulSoup(page_child)
    contracts = [tag_c['value']for tag_c in soup_child.findAll('input', {"name": "tariff-duration"})]
    data_usage = [tag_c['value']for tag_c in soup_child.findAll('input', {"name": "allowance"})]
    print contracts
    print data_usage

これで私を助けてください。ありがとう

4

8 に答える 8

26

質問に含めたリンクは、不完全な読み取り例外をキャッチする urllib の read() 関数を実行する単なるラッパーです。このパッチ全体を実装したくない場合は、リンクを読み取る try/catch ループをいつでもスローできます。例えば:

try:
    page = urllib2.urlopen(urls).read()
except httplib.IncompleteRead, e:
    page = e.partial

python3の場合

try:
    page = request.urlopen(urls).read()
except (http.client.IncompleteRead) as e:
    page = e.partial
于 2013-01-21T15:53:31.980 に答える
5

私にとってうまくいったのは、例外として IncompleteRead をキャッチし、これを以下のようなループに入れて、各反復で読み取ったデータを収集することです: )

try:
    requestObj = urllib.request.urlopen(url, data)
    responseJSON=""
    while True:
        try:
            responseJSONpart = requestObj.read()
        except http.client.IncompleteRead as icread:
            responseJSON = responseJSON + icread.partial.decode('utf-8')
            continue
        else:
            responseJSON = responseJSON + responseJSONpart.decode('utf-8')
            break

    return json.loads(responseJSON)

except Exception as RESTex:
    print("Exception occurred making REST call: " + RESTex.__str__())
于 2014-08-09T01:29:35.753 に答える
0

ウイルス検出器/ファイアウォールがこの問題を引き起こしていることがわかりました。AVG の「オンライン シールド」部分。

于 2015-05-18T19:08:03.057 に答える
-1

これらの解決策をすべて試しましたが、どれもうまくいきませんでした。実際、うまくいったのは、urllib を使用する代わりに、http.client (Python 3) を使用したことです。

conn = http.client.HTTPConnection('www.google.com')
conn.request('GET', '/')
r1 = conn.getresponse()
page = r1.read().decode('utf-8')

これは毎回完全に機能しますが、urllib では毎回不完全な読み取り例外が返されていました。

于 2015-10-28T17:46:22.880 に答える