我目前正在处理一段似乎适用于多个网站的代码,但是当再次运行时,下面的网站出现错误。 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
答案 0 :(得分:3)
在此处使用r.content
时,您应该真正使用r.text
,不 StringIO
。
r.text
为您提供unicode,r.content
为您提供原始字节。接下来,无需使用StringIO.StringIO
,etree.fromstring(html)
也可以正常使用。更好的是,将 raw 响应传递给.parse()
:
tree = etree.parse(r.raw, parser)
让解析器直接读取响应。
如果你得到IndexError
异常,那么你的XPath表达式与页面中的任何内容都不匹配。您将不得不保存HTML并手动分析它以查看该页面的不同之处。