我目前正在编写一段代码,该代码似乎适用于多个网站,但是当再次运行下面的网站时,我收到错误。 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
最佳答案
在此处使用 StringIO
时,您确实应该使用 r.content
,而不是 r.text
。
r.text
为您提供 unicode,r.content
为您提供原始字节。接下来,不需要使用StringIO.StringIO
,etree.fromstring(html)
就可以正常工作。更好的是,将原始响应传递给.parse()
:
tree = etree.parse(r.raw, parser)
并让解析器直接读取响应。
如果您仍然收到 IndexError
异常,则您的 XPath 表达式与页面中的任何内容都不匹配。您必须保存 HTML 并手动分析它以查看该页面有什么不同。
关于python - 索引错误: list index out of range,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16105507/