2014-11-09 7 views
1

Так что я работаю над проектом Scrapy, и я получил следующий бит HTML я хотел бы, чтобы захватить, используя XPath:Как исключить некоторые элементы с помощью xpath?

<table id='foobar'> 
    <tr> 
     <td><p>....</td> 
     <td><div>...</div></td> 
    </tr> 
    <tr> 
     <td><script type='text/javascript'>...</script></td> 
     <td><p>.....<br></td> 
    </tr> 
    <tr> 
     <td><div><p>.....</div></td> 
     <td><script type='text/javascript'>...</script></td> 
    </tr> 
    <!--repeat for another 250 or so rows--> 
</table> 

Это смесь из данных таблицы в <div> с и <p> с , с кучей тегов скриптов, брошенных в микс. Иногда теги <script> находятся внутри <div> с, что делает это немного сложнее. В основном мне нужна таблица WHOLE, но не теги скрипта или их содержимое. XPath первоначально:

//table[contains(@id, 'foobar')] 

, но это не исключает теги сценария, так что я изменил его на

//table[contains(@id, 'foobar')]//script/*[following-sibling::* and preceding-sibling::*] 

мышления, который будет работать, но. Возможно ли это сделать в xpath, или мне просто лучше просто хватать все из таблицы, перебирать содержимое и удалять все, что имеет «text/javascript» в нем?

+0

Так как вы используете 'Scrapy', вы можете просто извлечь детали именно то, что вы хотите в таблице с помощью XPath (исключить тег сценария), нет нужно все схватить. Но если проект меньше, получить все сначала просто неплохо. – Anzel

ответ

1

использование //*[not(self::script)] может исключить все дочерние узлы с <script> тегом

from lxml import etree 

# you have invalid closing tags which I have fixed on my string 
s = ''' 
<table id='foobar'> 
    <tr> 
     <td><p>....</p></td> 
     <td><div>...</div></td> 
    </tr> 
    <tr> 
     <td><script type='text/javascript'>...</script></td> 
     <td><p>.....<br /></p></td> 
    </tr> 
    <tr> 
     <td><div><p>.....</p></div></td> 
     <td><script type='text/javascript'>...</script></td> 
    </tr> 
    <!--repeat for another 250 or so rows--> 
</table> 
''' 

tree = etree.fromstring(s) 

for each in tree.xpath("//table[contains(@id, 'foobar')]//*[not(self::script)]"): 
    print each.tag 

tr 
td 
p 
td 
div 
tr 
td 
td 
p 
br 
tr 
td 
div 
p 
td 
Смежные вопросы