2

現在、いくつかの Web サイトで動作しているように見えるコードに取り組んでいますが、以下の Web サイトを再度実行するとエラーが発生します。IndexError: リスト インデックスが範囲外です。最初は xpath が無効でしたが、xpath をさらに調査した結果、正しいことがわかりました。私の唯一の他のことは、ウェブサイトにアクセスするブラウザをシミュレートするために、ブラウザのユーザーエージェントなどを提供する必要があるかもしれないということです。

ここに失敗するコードのセクションがあります

def safeweb(host):
    print "[*] Launching Norton Safeweb plugin against " + host
    url = 'http://safeweb.norton.com/report/show?url=' + host
    r = requests.get(url)
    html = r.text 
    #print html
    parser = etree.HTMLParser()
    tree = etree.parse(StringIO.StringIO(html), parser)
    #reporting starts here
    summary = tree.xpath("//*[@id='siteSummary']/table/tbody/tr[1]/td[2]/div/div[1]/div[2]/div")
    #print len(summary)
    print "[*] Summary: " + summary[0].text
4

1 に答える 1

3

ここで作業するときではなくr.content、本当に を使用する必要があります。 r.textStringIO

r.textユニコードをr.content提供し、生のバイトを提供します。StringIO.StringIO次に、を使用する必要はありませんetree.fromstring(html)。問題なく動作します。さらに良いことに、生の応答をに渡し.parse()ます。

tree = etree.parse(r.raw, parser)

パーサーに応答を直接読み取らせます。

それでもIndexError例外が発生する場合は、XPath 式がページ内のどこにも一致しませんでした。代わりに HTML を保存し、手動で分析してそのページの違いを確認する必要があります。

于 2013-04-19T13:21:22.603 に答える