wikicfp.xml парсер python 3

1

Я пытаюсь проанализировать 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, столбец 40 UnicodeDecodeError: кодек '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()
  • 0
    Можете ли вы показать некоторые из ваших попыток?
  • 0
    импортировать xml.etree.ElementTree как ET tree = ET.parse ('wikicfp.v1.2009.xml') root = tree.getroot ()
Показать ещё 3 комментария
Теги:
python-3.x
xml-parsing

1 ответ

0

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

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

  • 0
    Спасибо за попытку и помощь. не могли бы вы написать другие шаги по извлечению текстов полей из строки? Это будет более полезным.
  • 0
    Я добавил итерации по строкам и полям.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню