2012-07-09 29 views
8

Cố gắng phân tích cú pháp tệp Python sau bằng cách sử dụng hàm lxml.etree.iterparse.phân tích cú pháp tệp xml lớn bằng lỗi Python - etree.parse

"sampleoutput.xml"

<item> 
    <title>Item 1</title> 
    <desc>Description 1</desc> 
</item> 
<item> 
    <title>Item 2</title> 
    <desc>Description 2</desc> 
</item> 

Tôi đã thử các mã từ Parsing Large XML file with Python lxml and Iterparse

trước etree.iterparse (myfile) gọi tôi đã làm myfile = open ("/ Users/eric/Desktop/wikipedia_map /sampleoutput.xml","r ")

Nhưng nó quay lên các lỗi sau

Traceback (most recent call last): 
    File "/Users/eric/Documents/Programming/Eclipse_Workspace/wikipedia_mapper/testscraper.py", line 6, in <module> 
    for event, elem in context : 
    File "iterparse.pxi", line 491, in lxml.etree.iterparse.__next__ (src/lxml/lxml.etree.c:98565) 
    File "iterparse.pxi", line 543, in lxml.etree.iterparse._read_more_events (src/lxml/lxml.etree.c:99086) 
    File "parser.pxi", line 590, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:74712) 
lxml.etree.XMLSyntaxError: Extra content at the end of the document, line 5, column 1 

bất kỳ ý tưởng nào? cảm ơn bạn!

+1

Nó có thể được rằng tập tin XML của bạn bị thay đổi? Nó không chứa thẻ ' C0deH4cker

+1

Tôi không biết lxml, nhưng ví dụ của bạn không phải là XML hợp lệ. Một tài liệu XML phải có một phần tử gốc duy nhất. Của bạn không. –

+1

bạn cần một phần tử gốc, không chỉ các nút con. – pinkdawn

Trả lời

7

Vấn đề là XML không được định dạng đúng nếu nó không có chính xác một thẻ cấp cao nhất. Bạn có thể sửa mẫu của mình bằng cách gói toàn bộ tài liệu trong các thẻ <items></items>. Bạn cũng cần các thẻ <desc/> để khớp với truy vấn bạn đang sử dụng (description).

Các tài liệu sau đây tạo ra kết quả đúng với mã hiện tại của bạn:

<items> 
    <item> 
    <title>Item 1</title> 
    <description>Description 1</description> 
    </item> 
    <item> 
    <title>Item 2</title> 
    <description>Description 2</description> 
    </item> 
</items> 
+0

điều gì sẽ xảy ra nếu tệp quá lớn và tôi không muốn tải nó trong bộ nhớ để tôi phân tích cú pháp bằng cách sử dụng iterparse? –

3

Theo như tôi biết, xml.etree.ElementTree thường mong đợi tệp XML chứa một phần tử "gốc", nghĩa là một thẻ XML bao quanh cấu trúc tài liệu hoàn chỉnh. Từ thông báo lỗi bạn đã đăng, tôi giả định rằng đây cũng là vấn đề ở đây:

'Dòng 5' là thẻ thứ hai <item>, vì vậy tôi đoán Python có nhiều dữ liệu hơn sau phần tử gốc được giả định (tức là thẻ <item> đầu tiên) đã bị đóng.

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