我正试图通过xpath捕获一个位于"//html/body/table/tbody/tr/td[2]/table/tbody/tr[2]/td[17]/font"中的值。我不确定我做错了什么,但当运行下面的代码时,我收到了错误消息"AttributeError:'unicode'对象没有属性'xpath'"。你能帮我吗
import smtplib
import requests
#import bs4
from lxml import html
from email.mime.text import MIMEText
def login():
url = "http://172.16.3.16/bkg/nimble/newsite_airfail_isimba_dom.php"
r = requests.get(url, auth=('stats', 'Stats'))
page = r.text
return page
def extractfailure():
loginpage = login()
fail = loginpage.xpath('/html/body/table/tbody/tr/td[2]/table/tbody/tr[2]/td[17]/font')
print fail
if __name__ == '__main__':
extractfailure()
您似乎忘记了解析响应主体。
在使用XPath表达式之前,您需要在某个地方实际使用lxml.html
解析器:
def extractfailure():
loginpage = html.fromstring(login())
fail = loginpage.xpath('/html/body/table/tbody/tr/td[2]/table/tbody/tr[2]/td[17]/font')
print fail
如果文档中缺少<tbody>
元素,请考虑浏览器会插入这些元素。LXML没有插入这些,所以您的浏览器源XPath表达式可能是错误的。
对于那些在使用xpath 时获得以下输出的人
[<Element font at 0xeee158>]
这是因为您没有给text((以使用xpath捕获文本,如下所示
//html/body/table//tr/td[2]/table//tr[2]/td[17]/font/text()
多亏了@Martijn Pieters ,我的问题现在得到了解决
这是的完整代码
def extractfailure():
loginpage = html.fromstring(login())
fail = loginpage.xpath('//html/body/table//tr/td[2]/table//tr[2]/td[17]/font/text()')
failoutput = fail
print failoutput