Cara mengurai tag HTML sebagai teks mentah menggunakan ElementTree

Saya memiliki file yang memiliki HTML di dalam tag XML dan saya ingin HTML itu sebagai teks mentah, daripada menguraikannya sebagai turunan dari tag XML. Berikut ini contohnya:

import xml.etree.ElementTree as ET
root = ET.fromstring("<root><text><p>This is some text that I want to read</p></text></root>")

Jika saya mencoba:

root.find('text').text

Ini tidak mengembalikan keluaran

tetapi root.find('text/p').text akan mengembalikan teks paragraf tanpa tag. Saya ingin semua yang ada di dalam tag teks sebagai teks mentah, tetapi saya tidak tahu cara mendapatkannya.


person seitzej    schedule 24.06.2014    source sumber


Jawaban (2)


Solusi Anda masuk akal. Objek elemen adalah daftar anak-anak. Atribut .text dari objek elemen hanya terkait dengan hal-hal (biasanya teks) yang bukan bagian dari elemen (bersarang) lainnya.

Ada beberapa hal yang perlu diperbaiki dalam kode Anda. Di Python, penggabungan string adalah operasi yang mahal. Lebih baik membuat daftar substring dan menggabungkannya nanti -- seperti ini:

output_lst = []  
for child in root.find('text'):
    output_lst.append(ET.tostring(child, encoding="unicode"))

output_text = ''.join(output_lst)

Daftar juga dapat dibuat menggunakan konstruksi pemahaman daftar Python, sehingga kodenya akan berubah menjadi:

output_lst = [ET.tostring(child, encoding="unicode") for child in root.find('text')]  
output_text = ''.join(output_lst)

.join dapat menggunakan iterable apa pun yang menghasilkan string. Dengan cara ini daftar tersebut tidak perlu dibuat terlebih dahulu. Sebagai gantinya, ekspresi generator (yang dapat dilihat di dalam [] pemahaman daftar) dapat digunakan:

output_text = ''.join(ET.tostring(child, encoding="unicode") for child in root.find('text'))

Satu baris dapat diformat menjadi lebih banyak baris agar lebih mudah dibaca:

output_text = ''.join(ET.tostring(child, encoding="unicode")
                      for child in root.find('text'))
person pepr    schedule 25.06.2014

Saya bisa mendapatkan apa yang saya inginkan dengan menambahkan semua elemen anak dari tag teks saya ke string menggunakan ET.tostring:

output_text = ""    
for child in root.find('text'):
    output_text += ET.tostring(child, encoding="unicode")

>>>output_text
>>>"<p>This is some text that I want to read</p>"
person seitzej    schedule 24.06.2014
comment
Yup, bagaimana dengan jawaban yang saya berikan? Bukankah ini terlihat lebih sederhana? - person alecxe; 24.06.2014
comment
Maaf, sepertinya permintaan awal saya kurang jelas. Saya ingin memiliki tag ‹p› (atau tag html lainnya) di string output_text daripada hanya teks bagian dalam tag. - person seitzej; 25.06.2014