You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从网页提取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:54:54