2008-12-19 9 views
6

क्या, सभी पाठ और उपटैग, तत्व के टैग के बिना ही हैं?ElementTree का उपयोग कर तत्व के पूर्ण XML या HTML सामग्री को मैं कैसे प्राप्त करूं?

होने

<p>blah <b>bleh</b> blih</p> 

मैं चाहता हूँ

blah <b>bleh</b> blih 

element.text रिटर्न "blah" और etree.tostring (तत्व) देता है:

<p>blah <b>bleh</b> blih</p> 

उत्तर

5

यह समाधान मैं का उपयोग कर समाप्त हो गया है:: लेकिन यह सोचते हैं आप इसे शायद का उपयोग कर आप टुकड़ा से रूट टैग अलग करना की कोशिश कर सकते के लिए मजबूत कारण

def element_to_string(element): 
    s = element.text or "" 
    for sub_element in element: 
     s += etree.tostring(sub_element) 
    s += element.tail 
    return s 
+0

जब कोई टेक्स्ट या कोई पूंछ नहीं है तो यह असफल होगा, है ना? – PEZ

+0

पीईजेड, हाँ, जब कोई टेक्स्ट नहीं होता है तो यह विफल रहता है, बस इसे मेरे कोड को चलाकर और इसे ठीक करके पाया जाता है। मेरे पास पूंछ के कई उदाहरण हैं और यह असफल नहीं होता है। यकीन नहीं है कि क्यों। – Pablo

+0

बस एक नाइटपिक: + = तारों पर कम प्रदर्शनकारी है। स्ट्रिंग्स और '' की एक सूची जमा करना सबसे अच्छा है। अंत में इसे शामिल करें। – cdleary

11

ElementTree पूरी तरह से काम करता है, आपके पास अपने आप को जवाब इकट्ठा करने के लिए। इस तरह कुछ ...

"".join([ "" if t.text is None else t.text ] + [ xml.tostring(e) for e in t.getchildren() ]) 

त्रुटियों को इंगित करने के लिए जेवी एमडी पीईजेड के लिए धन्यवाद।


संपादित करें।

>>> import xml.etree.ElementTree as xml 
>>> s= '<p>blah <b>bleh</b> blih</p>\n' 
>>> t=xml.fromstring(s) 
>>> "".join([ t.text ] + [ xml.tostring(e) for e in t.getchildren() ]) 
'blah <b>bleh</b> blih' 
>>> 

पूंछ की आवश्यकता नहीं है।

+0

बस एक टाइपो-विधि नाम - "फिनल" को इंगित करना जो मुझे लगता है कि "findall" होना चाहिए था। यहां तक ​​कि अगर findall का उपयोग किया जाता है तो इसका परिणाम इस http://pastebin.com/f6de9a841 में होता है। कृपया अपना उत्तर संशोधित करें। –

+0

@ जेवी: धन्यवाद। फिक्स्ड। –

+0

मैं ऐसा कुछ कर रहा हूं, लेकिन देखने के लिए। आप वास्तव में पूंछ गायब हैं। – Pablo

-3

कोई विचार एक बाहरी पुस्तकालय के लिए एक विकल्प हो सकता है अगर है, लेकिन वैसे भी - यह सोचते है पृष्ठ पर इस पाठ के साथ एक <p>, एक jQuery-समाधान होगा:

alert($('p').html()); // returns blah <b>bleh</b> blih 
1

मुझे शक है ElementTree है इसके लिए उपयोग करने के लिए चीज।

re.sub(r'(^<%s\b.*?>|</%s\b.*?>$)' % (element.tag, element.tag), '', ElementTree.tostring(element)) 
3

ये अच्छा जवाब, जो कर रहे हैं ओपी के सवाल का जवाब दें, खासकर यदि प्रश्न एचटीएमएल तक ही सीमित है। लेकिन दस्तावेज़ स्वाभाविक रूप से गन्दा हैं, और तत्व घोंसले की गहराई आमतौर पर भविष्यवाणी करना असंभव है।

डोम के getTextContent() को अनुकरण करने के लिए आपको एक (बहुत) सरल रिकर्सिव तंत्र का उपयोग करना होगा।

def get_deep_text(element): 
    text = element.text or '' 
    for subelement in element: 
     text += get_deep_text(subelement) 
    text += element.tail or '' 
    return text 
print(get_deep_text(element_of_interest)) 

कच्चे पाठ के बीच की सीमाओं के बारे में सभी जानकारी प्राप्त करने के लिए:: लिब्रे ऑफिस लेखक दस्तावेज़ में एक पैरा से

root_el_of_interest.element_count = 0 
def get_deep_text_w_boundaries(element, depth = 0): 
    root_el_of_interest.element_count += 1 
    element_no = root_el_of_interest.element_count 
    indent = depth * ' ' 
    text1 = '%s(el %d - attribs: %s)\n' % (indent, element_no, element.attrib,) 
    text1 += '%s(el %d - text: |%s|)' % (indent, element_no, element.text or '',) 
    print(text1) 
    for subelement in element: 
     get_deep_text_w_boundaries(subelement, depth + 1) 
    text2 = '%s(el %d - tail: |%s|)' % (indent, element_no, element.tail or '',) 
    print(text2) 
get_deep_text_w_boundaries(root_el_of_interest) 

उदाहरण आउटपुट (.fodt फ़ाइल

सिर्फ नंगे पाठ प्राप्त करने के लिए):

(el 1 - attribs: {'{urn:oasis:names:tc:opendocument:xmlns:text:1.0}style-name': 'Standard'}) 
(el 1 - text: |Ci-après individuellement la "|) 
    (el 2 - attribs: {'{urn:oasis:names:tc:opendocument:xmlns:text:1.0}style-name': 'T5'}) 
    (el 2 - text: |Partie|) 
    (el 2 - tail: |" et ensemble les "|) 
    (el 3 - attribs: {'{urn:oasis:names:tc:opendocument:xmlns:text:1.0}style-name': 'T5'}) 
    (el 3 - text: |Parties|) 
    (el 3 - tail: |", |) 
(el 1 - tail: | 
    |) 

गड़बड़ी के बारे में एक बिंदु यह है कि कोई कठोर और तेज़ नियम नहीं है जब एक पाठ शैली एक शब्द सीमा इंगित करती है और जब यह नहीं होती है: एक शब्द (बिना सफेद स्थान के) के तुरंत बाद सुपरस्क्रिप्ट का अर्थ है सभी उपयोग मामलों में एक अलग शब्द जिसका मैं कल्पना कर सकता हूं। ओटीओएच कभी-कभी आपको मिल सकता है, उदाहरण के लिए, एक दस्तावेज़ जहां पहला अक्षर या तो किसी कारण से बोल्ड किया जाता है, या शायद सामान्य यूसी चरित्र का उपयोग करने के बजाय इसे ऊपरी मामले के रूप में प्रस्तुत करने के लिए पहले अक्षर के लिए एक अलग शैली का उपयोग करता है।

और निश्चित रूप से कम मुख्य रूप से "अंग्रेजी-केंद्रित" इस चर्चा में सूक्ष्मता और जटिलताओं को अधिक से अधिक मिलता है!

0

यहां पर अधिकांश उत्तर XML पार्सर ElementTree पर आधारित हैं, यहां तक ​​कि PEZ's regex-based answer अभी भी आंशिक रूप से ElementTree पर निर्भर करता है।

ये सभी अच्छे मामलों के लिए अच्छे और उपयुक्त हैं, लेकिन केवल पूर्णता के लिए, यह ध्यान देने योग्य है कि ElementTree.tostring(...) आपको समकक्ष स्निपेट देगा, लेकिन मूल पेलोड के समान नहीं है। यदि, कुछ दुर्लभ कारणों से, आप सामग्री को निकालने के लिए चाहते हैं, तो आपको शुद्ध रेगेक्स-आधारित समाधान का उपयोग करना होगा। This example यह है कि मैं regex- आधारित समाधान का उपयोग कैसे करता हूं।

संबंधित मुद्दे