Я разбираю файл XML со специальными символами из иностранных языков в некоторых именах авторов (í = í , ï = ï , ò = ò etc). Мой код сталкивается с ошибкой «ExpatError: undefined entity:» при попытке обработать эти символы. Я видел библиотеку BeautifulSoup онлайн, но не уверен, как легко внедрить это в мой код без необходимости переписывать с использованием библиотеки lxml (если мое понимание верно). Каков наилучший способ решить эту проблему? Ура !

XML-данные для загрузки

<pub>
    <ID>75</ID>
    <title>Use of Lexicon Density in Evaluating Word Recognizers</title>
    <year>2000</year>
    <booktitle>Multiple Classifier Systems</booktitle>
    <pages>310-319</pages>
    <authors>
        <author>Petr Slav&iacute;k</author>
        <author>Venu Govindaraju</author>
    </authors>
</pub>

Код Python

import sqlite3
con = sqlite3.connect("publications.db")
cur = con.cursor()

from xml.dom import minidom

xmldoc = minidom.parse("test.xml")

#loop through <pub> tags to find number of pubs to grab
root = xmldoc.getElementsByTagName("root")[0]
pubs = [a.firstChild.data for a in root.getElementsByTagName("pub")]
num_pubs = len(pubs)
count = 0

while(count < num_pubs):

    #get data from each <pub> tag
    temp_pub = root.getElementsByTagName("pub")[count]
    temp_ID = temp_pub.getElementsByTagName("ID")[0].firstChild.data
    temp_title = temp_pub.getElementsByTagName("title")[0].firstChild.data
    temp_year = temp_pub.getElementsByTagName("year")[0].firstChild.data
    temp_booktitle = temp_pub.getElementsByTagName("booktitle")[0].firstChild.data
    temp_pages = temp_pub.getElementsByTagName("pages")[0].firstChild.data
    temp_authors = temp_pub.getElementsByTagName("authors")[0]
    temp_author_array = [a.firstChild.data for a in temp_authors.getElementsByTagName("author")]
    num_authors = len(temp_author_array)
    count = count + 1


    #process results into sqlite
    pub_params = (temp_ID, temp_title)
    cur.execute("INSERT INTO publication (id, ptitle) VALUES (?, ?)", pub_params)
    journal_params = (temp_booktitle, temp_pages, temp_year)
    cur.execute("INSERT INTO journal (jtitle, pages, year) VALUES (?, ?, ?)", journal_params)
    x = 0
    while(x < num_authors):
        cur.execute("INSERT OR IGNORE INTO authors (name) VALUES (?)", (temp_author_array[x],))
        x = x + 1

    #display results
    print("\nEntry processed: ", count)
    print("------------------\nPublication ID: ", temp_ID)
    print("Publication Title: ", temp_title)
    print("Year: ", temp_year)
    print("Journal title: ", temp_booktitle)
    print("Pages: ", temp_pages)
    i = 0
    print("Authors: ")
    while(i < num_authors):
        print("-",temp_author_array[i])
        i = i + 1

con.commit()
con.close()    

print("\nNumber of entries processed: ", count)  
0
douglasrcjames_old 24 Апр 2017 в 05:04

2 ответа

Лучший ответ

Вы можете декодировать данные, которые вы извлекли первыми, просто импортировав html, если вы используете python3.x

Html.unescape ( ы )

Преобразуйте все именованные и числовые ссылки на символы (например,>,>, & x3e;) в строке s в соответствующие символы Unicode.

>>import html
>>print(html.unescape("Petr Slav&iacute;k"))

Petr Slavík

Похоже, html-безопасный символ не может быть проанализирован и возвращен minidom как объект документа, вы должны прочитать файл и декодировать его, а затем отправить в виде строки в модуль, как в следующем коде.

Xml.dom.minidom.parseString (string [, parser])

Вернуть документ, который представляет строку.

file_text = html.unescape(open('text.xml', 'r').read())
xmldoc = minidom.parseString(file_text)
1
M. Leung 24 Апр 2017 в 07:40
.encode('UTF-8') #Add to your code at the end of the example

UTF-8 Имеет поддержку большинства из следующих символов, должно работать, Добавить:

xmldoc = minidom.parse("test.xml")
NewXML = xmldoc.encode('utf-8', 'ignore')
1
Yono 25 Апр 2017 в 01:36
43578696