วิธีแยกแท็ก HTML เป็นข้อความดิบโดยใช้ ElementTree

ฉันมีไฟล์ที่มี HTML อยู่ในแท็ก XML และฉันต้องการให้ HTML นั้นเป็นข้อความดิบ แทนที่จะแยกวิเคราะห์เป็นลูกของแท็ก XML นี่คือตัวอย่าง:

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

ถ้าฉันลอง:

root.find('text').text

มันส่งคืนไม่มีเอาต์พุต

แต่ root.find('text/p').text จะส่งคืนข้อความย่อหน้าโดยไม่มีแท็ก ฉันต้องการทุกอย่างในแท็กข้อความเป็นข้อความดิบ แต่ไม่รู้ว่าจะต้องทำอย่างไร


person seitzej    schedule 24.06.2014    source แหล่งที่มา


คำตอบ (2)


วิธีแก้ปัญหาของคุณสมเหตุสมผล วัตถุองค์ประกอบคือรายการลูก คุณลักษณะ .text ของวัตถุองค์ประกอบเกี่ยวข้องกับสิ่งต่างๆ (โดยปกติจะเป็นข้อความ) ที่ไม่ได้เป็นส่วนหนึ่งขององค์ประกอบอื่น (ซ้อนกัน) เท่านั้น

มีสิ่งที่ต้องปรับปรุงในโค้ดของคุณ ใน Python การต่อสตริงเป็นการดำเนินการที่มีราคาแพง เป็นการดีกว่าที่จะสร้างรายการสตริงย่อยและเข้าร่วมในภายหลัง เช่นนี้

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

output_text = ''.join(output_lst)

รายการยังสามารถสร้างได้โดยใช้โครงสร้าง Python list comprehension ดังนั้นโค้ดจะเปลี่ยนเป็น:

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

.join สามารถใช้การวนซ้ำใดๆ ที่สร้างสตริงได้ วิธีนี้ไม่จำเป็นต้องสร้างรายการล่วงหน้า แต่สามารถใช้นิพจน์ตัวสร้าง (นั่นคือสิ่งที่สามารถเห็นได้ใน [] ของความเข้าใจรายการ) แทน:

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

ซับเดียวสามารถจัดรูปแบบเป็นบรรทัดเพิ่มเติมเพื่อให้อ่านง่ายขึ้น:

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

ฉันสามารถได้สิ่งที่ต้องการโดยการต่อท้ายองค์ประกอบลูกทั้งหมดของแท็กข้อความของฉันเข้ากับสตริงโดยใช้ 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
ใช่ แล้วคำตอบที่ฉันให้ไปล่ะ? มันไม่ดูง่ายกว่าเหรอ? - person alecxe; 24.06.2014
comment
ขออภัย ฉันเดาว่าคำขอเริ่มแรกของฉันไม่ชัดเจนนัก ฉันต้องการให้แท็ก ‹p› (หรือแท็ก html อื่นๆ) อยู่ในสตริง output_text แทนที่จะเป็นเพียงข้อความภายในของแท็ก - person seitzej; 25.06.2014