wikicfp.xml парсер python 3 - PullRequest
       9

wikicfp.xml парсер python 3

0 голосов
/ 10 октября 2018

Я пытаюсь разобрать wikicfp.v1.2008.xml и wikicfp.v1.2009.xml и wikicfp.v1.2010.xml.Три доступные версии по ссылке ниже.https://github.com/creswick/wikicfp-parser/tree/master/data Я пытался с XML.etree.ElementTree и с Beautifulsoup, но я получил много ошибок кодирования, таких как

не правильно сформирован (недопустимый токен): строка 949, столбец 40UnicodeDecodeError: кодек 'charmap' не может декодировать байт 0x9d в позиции 63563: отображение символов на неопределенное>

Я не смог прогрессировать из-за ошибок.Я хочу проанализировать каждую строку и сохранить ее в файле сценария SQL или в файле CSV для дальнейшего использования.

from bs4 import BeautifulSoup
out_file = open("final.sql","w")
out_file.write("--DROP TABLE event1;\n")
out_file.write("CREATE TABLE event1 (eventid int, fullname TEXT, location TEXT, begindate TINYTEXT , finishdate TINYTEXT , weblink TEXT, info TEXT, PRIMARY KEY (eventid));\n")
out_file.close()
infile = open("wikicfp.v1.2009.xml",encoding='utf-8-sig')
contents = infile.read()
soup = BeautifulSoup(contents)
rows = soup.find_all('row')
c = 0
for count in rows:
    tempsoup = rows[c]
    try:
        ei = tempsoup.findAll("field", {"name":"eventid"})
        if not ei[0].contents[0].strip():
            ei = "No info"
        eventid = ei[0].contents[0].strip()

    except Exception:
        eventid = 0

    try:
        fn = tempsoup.findAll("field", {"name":"fullname"})
        s = fn[0].contents[0].strip()
        fullname = s.decode('utf-8')
        fullname = fullname.replace("'","_")
    except Exception:
        fullname = "No info"
    try:
        l = tempsoup.findAll("field", {"name":"location"})
        s = l[0].contents[0].strip()
        location = s.decode('utf-8')

        location = location.replace("'","_")

    except Exception:

        location = "No info"

    try:

        bd = tempsoup.findAll("field", {"name":"begindate"})

        s = bd[0].contents[0].strip()

        begindate = s.decode('utf-8')

    except Exception:

        begindate = "No info"

    try:

        fd = tempsoup.findAll("field", {"name":"finishdate"})

        s = fd[0].contents[0].strip()

        finishdate = s.decode('utf-8')

    except Exception:

        finishdate = "No info"

    try:

        wl = tempsoup.findAll("field", {"name":"weblink"})

        s = wl[0].contents[0].strip()

        weblink = s.decode('utf-8')

    except Exception:

        weblink = "No info"

    try:

        i = tempsoup.findAll("field", {"name":"info"})

        s = i[0].contents[0].strip()

        info = s.decode('utf-8')

        info = info.replace("'","_")

    except Exception:

        info = "No info"
    with open("final.sql","a") as out_file:
        out_file.write("INSERT INTO event VALUES (")
        out_file.write(eventid)
        out_file.write(", '")
        out_file.write(fullname)
        out_file.write("', '")
        out_file.write(location)
        out_file.write("','")
        out_file.write(begindate)
        out_file.write("','")
        out_file.write(finishdate)
        out_file.write("','")
        out_file.write(weblink)
        out_file.write("','")
        out_file.write(info)
        out_file.write("');\n")
        c=c+1
out_file.close()
infile.close()

еще одна попытка запуска из bs4 import BeautifulSoup

with open("wikicfp.v1.2009.xml") as fp:
    soup = BeautifulSoup(fp, 'xml')
rows = soup.find_all('row')

еще одна попытка

import xml.etree.ElementTree as ET
tree = ET.parse('wikicfp.v1.2009.xml')
root = tree.getroot()

1 Ответ

0 голосов
/ 10 октября 2018

Похоже, ваши xml-файлы содержат недопустимые символы.Я пробовал несколько различных текстовых редакторов (Notepad ++, скобка, Блокнот, ...) и все они работали в нескольких положениях, они не могли правильно кодировать (например, в 2008-xml в конце строки 56964).Таким образом, xml-парсер не может разобрать xml прямо здесь.Вы можете использовать lxml и его опцию восстановления парсеров, чтобы игнорировать эти символы:

import lxml.etree as ET

tree = ET.parse('wikicfp.v1.2008.xml', 
ET.XMLParser(encoding='ISO-8859-1', ns_clean=True, recover=True))
root = tree.getroot()
rows = root.findall('row')
for row in rows:
    fields = row.findall('field')
    for field in fields:
        print(field)

Вы можете получить lxml, просто набрав pip install lxml в вашем bash

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...