2017-01-05 4 views
0

Я получил этот HTML строку:Исключить содержимое тега из объекта Xpath

'<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)]') 

Но это, кажется недопустимым выражение.

ответ

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' 

Это именно то, что я хотел.

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 может использоваться для получения любого текстового содержимого, которое у него есть.

+0

Благодарим за предложение. Как я вижу здесь, https://doc.scrapy.org/en/1.2/topics/selectors.html#using-exslt-extensions scrapy селекторов также основаны на lxml. –

Смежные вопросы