2012-12-17 24 views
6

Tôi có một tập tin HTML:Extract văn bản với lxml.html

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

Tôi muốn trích xuất các văn bản như:

somestr anotherstr

nhưng tôi không thể tìm ra làm thế nào để làm nó. Tôi đã viết một hàm to_sup() có thể chuyển đổi chuỗi số để superscript nên gần nhất tôi nhận được là một cái gì đó như:

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

nhưng tôi ElementStringResult dường như không có một phương pháp để có được tên thẻ, vì vậy tôi một chút mất đi. Bất kỳ ý tưởng làm thế nào để giải quyết nó?

+1

Vâng, sau đó bỏ qua văn bản() từ truy vấn và trích xuất văn bản trực tiếp từ các nút. –

+0

@ user1833746 - đã cố gắng 'cho x trong doc.xpath (" // p | // sup "): in (x.text)', nhưng điều này chỉ xuất ra 'somestr1' – root

Trả lời

3

Chỉ cần không gọi text() trên các nút sup trong XPath.

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

cảm ơn bạn, hoạt động như một sự quyến rũ. – root

7

giải pháp đầu tiên (concatenates văn bản không có dấu phân cách - xem thêm 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() 

này đã giúp tôi - nối con đường tôi cần:

from lxml import etree 
    print "\n".join(etree.XPath("//text()")(document)) 
Các vấn đề liên quan