十二月309
2022-04-13 10:57
采纳率: 50%
浏览 24
已结题

Python无法使用xpath解析带命名空间的html标签

问题遇到的现象和发生背景

在爬虫时遇到带命名空间的html标签mm:beginlockmm:endlock,无法使用xpath解析内容

问题相关代码,请勿粘贴截图

下为html结构

<mm:beginlock translatorclass="xx" type="xx" orig="%3C!--#include file=%22xx.inc%22--%3E" fileref="xx.inc" depfiles="file://///xx.xx.xx.xx/d$/bb/zz/xx.inc"><meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <mm:endlock>...</mm:endlock>
</mm:beginlock>

下为爬虫代码

html = requests.get(url, headers=header)
selector = etree.HTML(html.text)
print(date_temp = selector.xpath('/html/body/mm:beginlock/mm:endlock/table/tbody/tr[2]/td[1]/text()'))
运行结果及报错内容

报错:lxml.etree.XPathEvalError: Undefined namespace prefix

我的解答思路和尝试过的方法

上网查询得知是xpath命名空间导致的,采用了两种方法仍未解决
1.忽略命名空间

html = requests.get(url, headers=header)
selector = etree.HTML(html.text)
print(selector.xpath('/html/body//*[name() = "mm:beginlock"]//*[name() = "mm:endlock"]/table/tbody/tr[2]/td[1]/text()))

输出结果:[]
2.节点前加命名空间的前缀

html = requests.get(url, headers=header)
selector = etree.HTML(html.text)
print(selector.xpath('/html/body/mm:beginlock/mm:endlock/table/tbody/tr[2]/td[1]', namespaces={"mm"="mm:"}))

编译器第三行标红报错:Cannot assign to function call

我想要达到的结果

用xpath解析带命名空间的html标签

1条回答 默认 最新

相关推荐 更多相似问题