Python XPath解析包含单引号的标签

8

我刚接触XPath。 我正在尝试使用XPath解析页面。 我需要从<title>标签中获取信息,但是标题中的撇号会使一切都出错。

我使用Grab进行解析。

源代码中的标签:

<img src='somelink' border='0' alt='commission:Alfred\'s misadventures' title='commission:Alfred\'s misadventures'>

实际 XPath:

g.xpath('.//tr/td/a[3]/img').get('title')

返回
commission:Alfred\\

有没有什么方法可以解决这个问题?

谢谢。


4
说实话,你应该庆幸你的.xpath返回了任何东西。这个HTML代码非常无效,以至于LXML的html模块不能处理它。 - Fred Foo
2
我刚刚用lxml和BeautifulSoup做了一些实验,但它们都没有正确解析它。显然,属性值的外部引号应该是双引号。HTML的来源是什么? - ekhumoro
2个回答

5
垃圾进,垃圾出。您的输入格式不正确,因为它没有正确转义单引号字符。许多编程语言(包括 Python)使用反斜杠字符来转义字符串字面量中的引号,但是 XML 不支持此种方式。您需要做以下两种操作之一:
1) 使用双引号将属性值括起来; 2) 使用&apos; 来包含单引号
XML 规范中得知:
为了允许属性值既包含单引号又包含双引号,撇号或单引号字符(')可以表示为“&apos;”,双引号字符(“)可以表示为“&quot;”。

谢谢提供信息,但那不是我的输入。我正在尝试解析一个带有该标签的页面,所以唯一的解决方法是替换整个源代码中的标签。幸运的是,我已经用正则表达式解决了这个问题(虽然不完全)。 - Stanislav Golovanov
1
XML违反了Postel法则,但在实践中有时需要在将其发送到适当的XML解析器之前对输入进行处理。一些纯粹主义者会责备你,但我不会对此感到太难过。 - Wayne
XML已经允许两种方法将撇号放入属性值中:(1)用引号而不是撇号括起值 (2)使用&apos;。让我们使其符合Postel标准,并添加两种额外的方法。(1)反斜杠转义 (2)像SQL中一样加倍撇号。你的任务:更新语法,增强解析器。另一种选择:庆幸XML避免了HTML混乱的局面,消费者不得不竭尽全力接受糟糕的HTML。 - John Machin
消费者总是会尽力接受错误的输入,因为否则就是在因一些他们毫不关心的技术争论而惩罚用户。 - Wayne

2

由于提供的“XML”文档存在嵌套的撇号,因此无法对其进行XPath表达式评估.

可以通过以下方法将提供的非规范化文本更正:

<img src="somelink"
 border="0"
 alt="commission:Alfred's misadventures"
 title="commission:Alfred's misadventures"/>

如果有一个奇怪的要求不使用引号,那么一种正确的转换方法是

<img src='somelink'
 border='0'
 alt='commission:Alfred&apos;s misadventures'
 title='commission:Alfred&apos;s misadventures'/>

如果您提供了不正确的输入,在像C#这样的语言中,可以尝试使用以下方法将其转换为正确的对应项::

string correctXml = input.replace("\\'s", "&apos;s")

也许在Python中有类似的方法来做同样的事情。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接