从网页提取PLAYING等动态值的Python代码报错求助
解决动态播放状态提取的语法错误问题
看起来你在提取网页里的动态播放状态(PLAYING/BUFFERING/IDLE)时踩了CSS选择器的语法坑,我来帮你捋清楚问题出在哪,以及怎么解决。
首先,你遇到的SelectorSyntaxError是因为CSS选择器的写法错了:你用了tr[3]这种类似XPath的写法,但CSS里选择第n个子元素得用:nth-child(n)伪类,tr[3]在CSS里是找带有3这个属性的tr标签,完全不是你想要的“第3个tr”的意思,所以才会报错。
给你两种解决方案,都能搞定这个问题:
方案1:直接用你现成的XPath(最省心)
既然你已经有了正确的目标XPath /html/body/table/tr[3]/th[2]/font,完全没必要转成CSS选择器,直接用lxml的xpath()方法查询就行,代码修正后如下:
import urllib2 from lxml import etree SERVER = 'http://203.xx.xx.xxx:8080/uistatus.html' authinfo = urllib2.HTTPPasswordMgrWithDefaultRealm() authinfo.add_password(None, SERVER, 'admin', 'xxxxxxx') page = 'http://203.82.99.234:8080/uistatus.html' handler = urllib2.HTTPBasicAuthHandler(authinfo) myopener = urllib2.build_opener(handler) # 注意这里不需要把install_opener的返回值赋值给变量,它是无返回的 urllib2.install_opener(myopener) output = urllib2.urlopen(page) htmlparser = etree.HTMLParser() tree = etree.parse(output, htmlparser) # 直接用目标XPath提取文本内容 status_text = tree.xpath('/html/body/table/tr[3]/th[2]/font/text()') if status_text: # 取第一个匹配结果(因为你要的是唯一的状态值) print(status_text[0]) else: print("未找到状态元素")
方案2:修正CSS选择器写法
如果你坚持想用CSSSelector,就把选择器改成符合CSS语法的格式:用>表示直接子元素,用:nth-child()指定位置,修正后的代码片段:
from lxml.cssselect import CSSSelector # 替换原来错误的CSSSelector行 td_empformbody = CSSSelector('html > body > table > tr:nth-child(3) > th:nth-child(2) > font') for elem in td_empformbody(tree): # 提取font标签里的文本 print(elem.text)
另外提个小细节:你原来代码里opened = urllib2.install_opener(myopener)是多余的,因为install_opener()没有返回值,不需要赋值给变量。
还有,网页里有<meta http-equiv=refresh content="2; url=uistatus.html">,说明页面每2秒刷新一次,如果需要持续监控状态,可以加个循环,用time.sleep()每隔几秒重新请求一次页面。
内容的提问来源于stack exchange,提问作者Ossama
相关产品推荐
相关产品推荐

