2014-11-24 5 views
1

Я использую python scrapy для очистки некоторых данных с веб-сайта.xpath выбрать тексты узлов и дочерние узлы

содержание веб-сайта является то, как этот

<html> 
    <div class="details"> 
    <div class="a"> not needed</div> 
    content 1 
    <p>content 2</p> 
    <div>content 2</div> 
    <p>content 2</p> 
    <div>content 2</div> 
    <p>content 2</p> 
    <div class="b"> this is also not needed</div> 
    </div> 
</html> 

мне нужно, чтобы получить полные данные HTML за исключением DIV с классом а, б.

поэтому мой выход будет как этот

<div class="details"> 
content 1 
<p>content 2</p> 
<div>content 2</div> 
<p>content 2</p> 
<div>content 2</div> 
<p>content 2</p> 
</div> 

Как я могу написать правильный XPath для этого, или я должен написать XPath для DIV с классом «Детали», «A», «B» и использование строковых операций удалить div с помощью класса 'a', 'b'?

Обратите внимание, что здесь содержание текст и не является потомком DIV с класса «подробнее»

ответ

4

Вы можете получить все дети, кроме div с классом a или b использованием node() и self:: синтаксис:

//div[@class="details"]/node()[not(self::div[@class="a" or @class="b"])] 

Demo с использованием scrapy shell:

$ scrapy shell index.html 
>>> nodes = response.xpath('//div[@class="details"]/node()[not(self::div[@class="a" or @class="b"])]').extract() 
>>> print ''.join(nodes) 
    content 1 
    <p>content 2</p> 
    <div>content 2</div> 
    <p>content 2</p> 
    <div>content 2</div> 
    <p>content 2</p> 
Смежные вопросы