2012-12-17 20 views
6

Mam plik HTML:wyodrębnić tekst z lxml.html

<html> 
    <p>somestr 
     <sup>1</sup> 
     anotherstr 
    </p> 
</html> 

chciałbym wyodrębnić tekst jako:

somestr anotherstr

ale nie mogę dowiedzieć się, jak to zrobić. Napisałem to_sup() funkcję, która przekształca ciągów numerycznych SuperScript więc najbliżej mam coś takiego jak:

for i in doc.xpath('.//p/text()|.//sup/text()'): 
    if i.tag == 'sup': 
     print to_sup(i), 
    else: 
     print i, 

ale ElementStringResult nie wydaje się mieć metodę, aby uzyskać nazwę znacznika, więc jestem nieco Stracony. Wszelkie pomysły, jak to rozwiązać?

+1

No, to pominięcie tekstu() z zapytania i wyodrębnij tekst bezpośrednio z węzłów. –

+0

@ user1833746 - wypróbowany 'dla x w doc.xpath (" // p | // sup "): print (x.text)', ale to tylko wyprowadza 'somestr1' – root

Odpowiedz

3

Po prostu nie dzwoń pod text() na węzłach sup w XPath.

for x in doc.xpath("//p/text()|//sup"): 
    try: 
     print(to_sup(x.text)) 
    except AttributeError: 
     print(x) 
+0

dziękuję, działa jak czar. – root

7

pierwsze rozwiązanie (tekst Łączy bez separatora - patrz też python [lxml] - cleaning out html tags):

import lxml.html 
    document = lxml.html.document_fromstring(html_string) 
    # internally does: etree.XPath("string()")(document) 
    print document.text_content() 

ten pomógł mi - konkatenacji drogę co potrzebne:

from lxml import etree 
    print "\n".join(etree.XPath("//text()")(document)) 
Powiązane problemy