Mã hóa python xml = utf-8

Thứ tư, ngày 28 tháng 12 năm 2016 02. 05 giờ sáng, Bỏ qua Montanaro đã viết

> Tôi đang cố phân tích cú pháp một số XML không chỉ định mã hóa [Python
> 2. 7. 12 qua Anaconda trên RH Linux], do đó, nó sẽ chặn khi gặp dữ liệu không phải ASCII
>. Không có gì ngạc nhiên lắm, nhưng tôi gặp sự cố khi sử dụng mã này
> mã hóa khác. Trước tiên, tôi đã thử chỉ định mã hóa khi mở
> tệp.
>
> f = io. open[fname, encoding="utf8"]
> root = xml. cây etree. Yếu TốCây. phân tích cú pháp [f]. getroot[]

Tài liệu về ET. phân tích cú pháp khá thưa thớt

https. // tài liệu. con trăn. org/2/thư viện/xml. cây etree. nguyên tố cây. html#xml. cây etree. Yếu TốCây. phân tích cú pháp

nhưng chúng ta có thể suy luận rằng nó nên lấy byte làm đối số, không phải Unicode, vì
nó thực hiện xử lý bộ ký tự riêng. [Đối số trình phân tích cú pháp tùy chọn nhận một
đối số mã hóa mặc định là UTF-8. ]

Vì vậy, điều đó có nghĩa là sử dụng open[] hoặc io tích hợp sẵn. open[] ở chế độ nhị phân

Bạn mở tệp và đọc các byte từ đĩa, *giải mã* các byte đó thành
chuỗi Unicode UTF-8. Sau đó, trình phân tích cú pháp ET cố gắng giải mã chuỗi Unicode
thành Unicode, trước tiên nó sẽ *encoding* chuỗi đó trở lại byte bằng cách sử dụng
mã hóa mặc định [cụ thể là ASCII .

Lỗi cụ thể này là do Python2-ism, vì Python2 cố gắng hết sức để cho phép bạn
trộn các chuỗi byte và chuỗi unicode với nhau, do đó, nó sẽ thử hoàn toàn
encoding/decoding strings to try to get them to fit together. Python3 does
không làm điều này.

Bạn có thể dễ dàng mô phỏng lỗi này tại REPL

py> u"µ". decode['utf-8']
Traceback [lần gọi gần đây nhất].
Tệp "", dòng 1, trong
Tệp "/usr/local/lib/python2. 7/mã hóa/utf_8. py", dòng 16, trong giải mã
trả về codec. utf_8_decode[đầu vào, lỗi, Đúng]
UnicodeEncodeError. codec 'ascii' không thể mã hóa ký tự u'\xb5' ở vị trí
0. thứ tự không nằm trong phạm vi[128]

Điều may mắn là bạn đang có ý định thực hiện thao tác *decode* nhưng gặp lỗi
*encode*. Điều đó cho bạn biết rằng Python2 đang cố gắng trở nên hữu ích. -]

[Ghi nhớ. Chuỗi Unicode mã hóa thành byte và byte giải mã trở lại
chuỗi. ]

Bạn đang cố đọc byte từ tệp trên đĩa và lấy chuỗi Unicode ra

byte trong tệp -> Trình phân tích cú pháp XML -> Unicode

để được tính là thao tác giải mã. Nhưng bạn đang gặp phải
lỗi mã hóa -- đó là nguyên nhân gây khó chịu cho thấy bước Unicode->byte
đáng ngờ, sử dụng mã hóa mặc định [ASCII].

byte trong tệp --> io. mở[]. read[] -> Unicode -> Trình phân tích cú pháp XML -> giải mã thành
byte bằng ASCII -> mã hóa trở lại Unicode bằng UTF-8

Và điều đó gợi ý rằng cách khắc phục là mở tệp mà không xử lý bất kỳ bộ ký tự
nào, tôi. e. sử dụng open[] nội trang thay vì io. mở[].

byte trong tệp -> dựng sẵn open[]. read[] -> byte -> Trình phân tích cú pháp XML -> Unicode

Tôi nghĩ bạn thậm chí có thể bỏ qua phần chế độ 'rb'. vấn đề thực sự là bạn
không được cung cấp chuỗi Unicode cho trình phân tích cú pháp XML.

> nhưng điều đó không có tác dụng. Sau đó, khi gọi xml. cây etree. Yếu TốCây. phân tích cú pháp I
> bao gồm một đối tượng XMLParser.
>
> trình phân tích cú pháp = xml. cây etree. Yếu TốCây. XMLParser[encoding="utf8"]
> root = xml. cây etree. Yếu TốCây. phân tích cú pháp [f, trình phân tích cú pháp = trình phân tích cú pháp]. getroot[]

Đó là mặc định nên không có thay đổi về chức năng ở đây. Do đó,
lỗi

--
Steve
“Vui lên,” họ nói, “mọi thứ có thể tồi tệ hơn. ” Vì vậy, tôi đã vui lên, và chắc
đủ rồi, mọi thứ trở nên tồi tệ hơn.

Tôi đang cố gắng phân tích XML thành cấu trúc giống như bảng trong Python. Please idea XML as this



  element 1
  element 2
  
    subElement 3
  

Tôi muốn có kết quả như thế này

KEY                       | VALUE
base.element1             | "element 1"
base.element2             | "element 2"
base.element3.subElement3 | "subElement 3"

Tôi đã thử sử dụng xml. cây etree. celementtree, sau đó các hàm được mô tả ở đây làm thế nào để chuyển chuỗi XML thành từ điển trong Python?

Có bất kỳ chức năng nào có thể thực hiện điều này không? Tất cả các câu trả lời mà tôi tìm thấy đều được viết cho các cụ thể của sơ đồ XML và sẽ cần được chỉnh sửa, chỉnh sửa cho từng sơ đồ XML mới. Để tham khảo, trong r, thật dễ dàng với các gói XML và XML2 và chức năng xmltolist

XPath sử dụng các biểu thức đường dẫn để chọn các nút hoặc tập hợp nút trong tài liệu XML. Nút được chọn bằng cách đi theo một đường dẫn hoặc các bước

Tài liệu Ví dụ XML

Chúng tôi sẽ sử dụng tài liệu XML sau trong các ví dụ bên dưới


Harry Potter29. 99


Học XML39. 95

Chọn nút

XPath sử dụng các biểu thức đường dẫn để chọn các nút trong tài liệu XML. Nút được chọn bằng cách đi theo một đường dẫn hoặc các bước. Các biểu thức đường dẫn hữu ích nhất được liệt kê dưới đây

ExpressionDescriptionnodenameChọn tất cả các nút có tên "nodename"/Chọn từ nút gốc//Chọn các nút trong tài liệu từ nút hiện tại khớp với lựa chọn bất kể chúng ở đâu. Chọn nút hiện tại. Chọn cha của nút hiện tại@Chọn thuộc tính

Trong bảng dưới đây, chúng tôi đã liệt kê một số biểu thức đường dẫn và kết quả của các biểu thức

Biểu thức đường dẫnResultbookstoreChọn tất cả các nút có tên "hiệu sách"/hiệu sáchChọn phần tử gốc hiệu sách

Ghi chú. Nếu đường dẫn bắt đầu bằng dấu gạch chéo [ / ] thì nó luôn đại diện cho một đường dẫn tuyệt đối đến một phần tử

cửa hàng sách/sáchChọn tất cả các phần tử sách là con của cửa hàng sách//bookChọn tất cả các phần tử sách bất kể chúng ở đâu trong tài liệubookstore//bookChọn tất cả các phần tử sách là hậu duệ của phần tử cửa hàng sách, bất kể chúng ở đâu dưới phần tử cửa hàng sách//

Vị ngữ

Các vị từ được sử dụng để tìm một nút cụ thể hoặc một nút chứa một giá trị cụ thể

Vị ngữ luôn được đặt trong dấu ngoặc vuông

Trong bảng dưới đây, chúng tôi đã liệt kê một số biểu thức đường dẫn với các vị từ và kết quả của các biểu thức

Biểu thức đường dẫnResult/bookstore/book[1]Chọn phần tử sách đầu tiên là phần tử con của phần tử hiệu sách

Ghi chú. Trong IE 5,6,7,8,9 nút đầu tiên là [0], nhưng theo W3C, đó là [1]. Để giải quyết vấn đề này trong IE, hãy đặt SelectionLanguage thành XPath

Chủ Đề