HTML属性含双引号致XPath查询出现Invalid predicate错误求助
解决lxml XPath获取含双引号属性元素的报错问题
你的问题根源有两个:一是原始HTML的title属性写法不合法(内部双引号未转义),二是XPath表达式中对含双引号的字符串处理错误,导致Invalid predicate报错。
步骤1:明确lxml解析后的属性值
lxml的HTMLParser会自动修正不合法的HTML,你提供的原始HTML中,<a title="spre_|_"Marketing_|_Specialist">会被解析为属性值包含双引号的合法格式(内部双引号会被转义或保留为属性值的一部分),核心是属性值本身带有双引号字符。
步骤2:修正XPath表达式
XPath中处理含双引号的字符串,有两种可靠方法:
方法一:用单引号包裹属性值
如果属性值里只有双引号没有单引号,直接用单引号把整个属性值括起来,避免双引号冲突:
from lxml import etree from io import StringIO html_ = """<body class="loop"> <a title="spre_|_"Marketing_|_Specialist"> Marketing Specialist </a> </body>""" # 用单引号包裹title的属性值 xpath = """//a[@title='spre_|_"Marketing_|_Specialist'][1]""" tree = etree.parse(StringIO(html_), etree.HTMLParser()) print(tree.xpath(xpath))
方法二:使用concat函数拼接字符串
如果属性值同时包含单引号和双引号,用concat函数把字符串拆分成多个部分,分别用不同引号包裹,精准拼接出目标属性值:
from lxml import etree from io import StringIO html_ = """<body class="loop"> <a title="spre_|_"Marketing_|_Specialist"> Marketing Specialist </a> </body>""" # 用concat拼接,双引号部分单独用单引号包裹,其余部分用双引号 xpath = """//a[@title=concat("spre_|_", '"', "Marketing_|_Specialist")][1]""" tree = etree.parse(StringIO(html_), etree.HTMLParser()) print(tree.xpath(xpath))
为什么直接用\转义无效?
Python字符串里的\是转义Python自身的引号,而XPath表达式是独立的语法规则,Python转义后的\"到了XPath里会被当作普通双引号,无法正确识别字符串边界,所以必须遵循XPath自身的字符串处理规则。
内容的提问来源于stack exchange,提问作者Minions
相关产品推荐
相关产品推荐

