2

我目前正在处理一段似乎适用于多个网站的代码,但是当再次运行下面的网站时,我得到了错误。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.text在这里工作时StringIO

r.text给你unicode,r.content给你原始字节。接下来,不需要使用StringIO.StringIOetree.fromstring(html)就可以了。更好的是,将原始响应传递给.parse()

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

并让解析器直接读取响应。

如果您仍然遇到IndexError异常,那么您的 XPath 表达式与页面中的任何内容都不匹配。您必须改为保存 HTML 并手动分析它以查看该页面的不同之处。

于 2013-04-19T13:21:22.603 回答