从Xpath对象中排除标记内容

时间:2017-01-05 16:20:57

标签: regex python-3.x xpath

我收到了这个HTML字符串:

'<li><strong>Réf. Robster+ :</strong> 3185W061</li>'

我需要抓住参考3185I061。不可能使用正则表达式作为参考可能是非常不同的组合。

我的xpath对象(来自scrapy)返回:

In [124]: xpath_var
Out[124]: <Selector xpath='//*[@id="reference"]/ul/li' data='<li>  <strong>Réf. Clim+ :</strong> 318506'>

xp.xpath('.').extract_first()
'<li><strong>Réf. Robster+ :</strong> 3185W061</li>'

如何至少删除该部件?

目前,我已尝试过这个:

xp.xpath('./[not(self::strong)]')

但它似乎是一个无效的表达。

2 个答案:

答案 0 :(得分:0)

这会做你需要的吗?

>>> from lxml import etree
>>> from io import StringIO
>>> tree = etree.parse(StringIO('''<li><strong>Réf. Robster+ :</strong> 3185W061</li>'''))
>>> li = tree.xpath('//li')[0]
>>> list(li.itertext())
['Réf. Robster+ :', ' 3185W061']

编辑:我应该说更多。一旦使用xpath来定位li元素,它的itertext就可以用来获取它拥有的任何文本内容。

答案 1 :(得分:0)

以下是提取没有强标记内容的文本部分的方法。它有点令人困惑,因为你有2个xpath文本功能,不会返回相同的。在我的情况下,我使用的是text()而不是/@text

>>> xp.xpath('.').extract_first()
>>> '<li><strong>Réf. Robster+ :</strong> 3185W061</li>'

>>> xp.xpath('./@text').extract_first()
>>> 

>>> xp.xpath('./text()').extract_first()
>>> ' 3185W061'

这正是我想要的。