xpath属性包含特殊字符

时间:2015-09-08 11:35:35

标签: python xpath

<img width="410" height="410" #src="http://XXXX1.png" src="http://xxxx2.png" alt=""/>

我想提取图片地址http://xxxx1.png
我正在使用/ img / @#src但是什么都没有。它包含#char。

有什么建议吗? 谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

<img width="410" height="410" #src="http://XXXX1.png" src="http://xxxx2.png" alt=""/>

不幸的是,你不能用XPath做这件事,因为这个片段是无效的XML。 An XML NameChar cannot start, or contain, the hash symbol。并且XPath只能处理XML树,并且从这个片段中,你不能创建这样的树(任何XML解析器都会破坏该片段)。

要解决此问题,请通过删除该符号来预处理非真正的XML并使其正确。或者在源头修复它,如果你有权访问它,通过不生成无效的名称开始。

注意:XML(或HTML)中没有使用某种转义序列的机制。实体引用只能在值和文本节点中使用。

答案 1 :(得分:0)

如果它不是有效的XML,则不能使用XPath来查询该属性,因为XPath表达式中的名称是无效语法。

由于它甚至不是有效的HTML属性名称,因此您需要一个宽松的HTML解析器,它不会阻塞该属性甚至将其保留在结果中,而不是忽略无效的属性名称。 BeautifulSoup与html5lib的组合用于解析似乎有效。 Python标准库中的HTML解析器会阻塞该属性,而lxml.html会默默地忽略它。

In [33]: import bs4

In [34]: source
Out[34]: '<img width="410" height="410" #src="http://XXXX1.png" src="http://xxxx2.png" alt=""/>'

In [35]: doc = bs4.BeautifulSoup(source, 'html5lib')

In [36]: doc.img.attrs
Out[36]: 
{u'#src': u'http://XXXX1.png',
 u'alt': '',
 u'height': u'410',
 u'src': u'http://xxxx2.png',
 u'width': u'410'}

In [37]: doc.img.attrs['#src']
Out[37]: u'http://XXXX1.png'