2014-10-03 1 views
1

У меня есть следующая разметка HTML, и я хотел бы получить английское описание как обычный текст из этого фрагмента - без «английского и без каких-либо тегов»:Получить текст рядом с выбранным элементом в lxml/Python

from lxml import etree 


html = ''' 
    <td class="description"> 
    <p><b>English:</b> Ulm, Germany, old town with Münster, city wall and Metzgerturm, as seen from the south bank of the river Danube.</p> 
    <p><b>Deutsch:</b> Ulm, Ansicht der Altstadt vom rechten Donauufer aus. Abgebildet ist das Donauschwabenufer, von der Altstadt sind erkennbar: Das dominante Münster mit Hauptturm, Schiff und zwei Chortürmen; unterhalb des Hauptturms des Münsters zwei Giebel, die zur historischen Krone gehören (linker Giebel größtenteils von Bäumen verdeckt); die Spitze der neuen, gläsernen Stadtbibliothek von Gottfried Böhm; weiter rechts zwei Giebel des Rathauses (gelb-braun); am rechten Rand der Metzgerturm als Teil der Stadtbefestigung.</p> 
    </td> 
''' 

tree = etree.fromstring(html) 
for el in tree.xpath('//td[contains(concat(" ", normalize-space(@class), " "), " description ")]/div|p'): 
    print etree.tostring(el) 

С помощью этого скрипта я получаю отдельные абзацы, включая все теги, но я застрял там ... Пункты могут быть также DIV; поэтому я использовал div | p внутри xpath.

Решение LXML должны также работать с DIV контейнеров, как это:

<td class="description"> 
    <div class="description mw-content-ltr et" dir="ltr" lang="et" style=""><span class="language et" title=""><b>Eesti:</b></span> Olen loonud selle pildi, kui ma nägin arutelu uue Wiki logo.</div> 
    <div class="description mw-content-ltr en" dir="ltr" lang="en" style=""><span class="language en" title=""><b>English:</b></span> "Prototype" for new Wiktionary Logo</div> 
</td> 

ответ

3

текст, который вы хотите получить это хвост b теги:

import lxml.html 

html = u''' 
    <td class="description"> 
    <p><b>English:</b> Ulm, Germany, old town with Münster, city wall and Metzgerturm, as seen from the south bank of the river Danube.</p> 
    <p><b>Deutsch:</b> Ulm, Ansicht der Altstadt vom rechten Donauufer aus. Abgebildet ist das Donauschwabenufer, von der Altstadt sind erkennbar: Das dominante Münster mit Hauptturm, Schiff und zwei Chortürmen; unterhalb des Hauptturms des Münsters zwei Giebel, die zur historischen Krone gehören (linker Giebel größtenteils von Bäumen verdeckt); die Spitze der neuen, gläsernen Stadtbibliothek von Gottfried Böhm; weiter rechts zwei Giebel des Rathauses (gelb-braun); am rechten Rand der Metzgerturm als Teil der Stadtbefestigung.</p> 
    </td> 
    <td class="description"> 
     <div class="description mw-content-ltr et" dir="ltr" lang="et" style=""><span class="language et" title=""><b>Eesti:</b></span> Olen loonud selle pildi, kui ma nägin arutelu uue Wiki logo.</div> 
     <div class="description mw-content-ltr en" dir="ltr" lang="en" style=""><span class="language en" title=""><b>English:</b></span> "Prototype" for new Wiktionary Logo</div> 
    </td> 
''' 

tree = lxml.html.fromstring(html) 
for el in tree.cssselect('td.description p b, td.description span'): 
    if el.text_content().startswith('English'): 
     print(el.tail.strip()) 

выход:

Ulm, Germany, old town with Münster, city wall and Metzgerturm, as seen from the south bank of the river Danube. 
"Prototype" for new Wiktionary Logo 

ПРИМЕЧАНИЕ Вам необходимо использовать lxml.html. В противном случае вы не можете использовать метод text_cotnent().

+0

@SimonSteinberger, Не могли бы вы обновить вопрос с помощью html, который содержит 'div'? – falsetru

+0

Выполнено - Я хотел бы извлечь только английское описание. –

+0

Хорошо, но я все еще получаю описания, отличные от английского. Я пытаюсь извлечь только эти два предложения: «Ульм, Германия ...» и «Прототип для ...» –