2013-09-26 90 views
5

Có một danh sách tham chiếu ký tự XML và HTML tại: https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references.Chuyển đổi XML bất hợp pháp & char thành utf8 - python

Tuy nhiên, có những thứ không được xác định trong danh sách đó nhưng chúng được sử dụng trong các tập lệnh HTML cũ hơn. Khi tôi xử lý dữ liệu Senseval-2 format (with fixes) từ http://www.d.umn.edu/~tpederse/data.html, tôi gặp phải các từ sau đây khi nó phá vỡ tập lệnh của tôi đã cố sử dụng xml.et.elementTree để phân tích cú pháp dữ liệu.

Tương đương unicode của những từ này là gì?

&and. 
&and.A 
&and.B 
&and.D 
&and.L's 
&backquote.alim) 
&backquote.ulema 
&dash 
&dash. 
&dash." 
&dashq. 
&degree. 
&degree.C 
&ellip 
&ellip. 
&ellip.0 
&ellip.1 
&ellip.11 
&ellip.2 
&ellip.23 
&ellip.28 
&ellip.38 
&ellip.4 
&ellip.6 
&ellip.64 
&ellip.?" 
&ellip.two 
&times. 

kịch bản của tôi:

import xml.etree.ElementTree as et 
s1 = 'train-fix.xml' # from http://www.d.umn.edu/~tpederse/Data/Sval1to2.fix.tar.gz 
tree = et.parse(s1) 
root = tree.getroot() 

cho traceback này:

Traceback (most recent call last): 
    File "senseval.py", line 4, in <module> 
    tree = et.parse(s1) 
    File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1182, in parse 
    tree.parse(source, parser) 
    File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 656, in parse 
    parser.feed(data) 
    File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1642, in feed 
    self._raiseerror(v) 
    File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1506, in _raiseerror 
    raise err 
xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 41, column 113 
+0

Đó là không thực thể xml, nên chấm dứt whit một ';', không phải là một '.'. Tham chiếu thực thể: http://www.w3.org/TR/xml-entity-names/ – mata

+0

bất kỳ ý tưởng nào về chúng là gì? – alvas

+0

không thực sự. 'dấu gạch ngang' có thể là [thực thể ký tự html5] (http://dev.w3.org/html5/html-author/charref), nhưng mặt khác,' ellip' không phải là thực thể hợp lệ ở bất kỳ đâu tôi có thể tìm thấy, không phải là 'độ' ... – mata

Trả lời

3

Tôi tìm thấy câu trả lời này khiến cho nó có thể phân tích cú pháp xml của bạn sử dụng Python lxml gói:

Fetching data using Python & lxml

Cài đặt gói lxml từ đây: http://lxml.de/

Và sử dụng mã này:

import lxml.html 
root = lxml.html.parse('train-fix.xml').getroot() 

Hy vọng nó sẽ làm việc cho bạn

+0

+1 cho các phân tích cú pháp 'lxml' nhưng nó không giải quyết được vấn đề của' các ký tự đó là gì? '= ( – alvas

3

Câu trả lời cơ bản nhưng thất vọng là: chúng lỗi chính tả (sử dụng . thay vì ;).

Dưới đây là hầu hết trong số họ:

... và như vậy, bạn phải nhìn vào bối cảnh của một số trong số này, để đánh giá liệu tác giả văn bản gốc có nghĩa là một cái gì đó cụ thể, hoặc chỉ đơn giản là typo'ed thậm chí tệ hơn (dashq‽).

Hành động thích hợp nhất của bạn là sử dụng chuỗi chuỗi đơn giản replace các cuộc gọi phương pháp để khắc phục sự cố, trước khi phân tích cú pháp.

4

"Từ" trông giống như bị sai lệch entity references. Tham chiếu thực thể hợp lệ có dấu chấm phẩy ở cuối. Tôi đã xem test-fix.xml (trong Sval1to2.fix.tar.gz) và có vẻ như rất có thể là &dash (hoặc &dash.) có nghĩa là đại diện cho một số loại gạch ngang hoặc gạch nối. Tệp có phần mở rộng .xml và nó sẽ khá gần với XML được định dạng tốt nếu các tham chiếu thực thể không hợp lệ đã được sửa.

Trên trang mà bạn liên kết đến (http://www.d.umn.edu/~tpederse/data.html), nó nói:

Xin lưu ý rằng dữ liệu chuyển đổi của chúng tôi sẽ không phải là "phân tích" dưới dạng văn bản xml đúng. Điều này là do thực tế là trong văn bản gốc được gắn thẻ có nghĩa, các ký tự yêu cầu xử lý đặc biệt trong xml không bị thoát, v.v. Chúng tôi đang xem xét các cách để làm cho dữ liệu này "đúng" xml và sẽ biết ơn nhất đối với bất kỳ phản hồi nào về cách thực hiện tốt nhất điều này.

Vì vậy, mặc dù tài liệu trông rất giống XML, nhưng đó không phải là XML và những người đã xuất bản nó đều biết rõ điều đó.

2

nếu bạn có sử dụng Linux có sẵn xmllint để tìm lỗi và sửa chữa chúng

xmllint --recover ~/tmp/test-fix.xml --output ~/tmp/test-fix-fixed.xml 
/home/luis/tmp/test-fix.xml:179: parser error : EntityRef: expecting ';' 
inate, Hesse and the Saarland; North Rhine-Westphalia, Baden-Wu&umlaut.rttemberg 
                     ^
/home/luis/tmp/test-fix.xml:179: parser error : EntityRef: expecting ';' 
Bavaria would remain untouched, and the planned five East German La&umlaut.nder 
... 
/home/luis/tmp/test-fix.xml:3832: parser error : EntityRef: expecting ';' 
Charlie Watts today) we should be ready to hit the road together as Lyndon &and. 
                     ^
/home/luis/tmp/test-fix.xml:3841: parser error : Opening and ending tag mismatch: corpus line 1 and lexelt 
</lexelt> 
    ^
/home/luis/tmp/test-fix.xml:3842: parser error : Extra content at the end of the document 
<lexelt item="behaviour-n"> 


                     ^
Các vấn đề liên quan