lxml исходная строка возвращается Нет - PullRequest
0 голосов
/ 25 июня 2019

Нужно получить номер строки xml при разборе с использованием beautifulsoup и lxml.

В xml отсутствует корневой тег, поэтому нельзя напрямую использовать дерево элементов XML / lxml. Так что соскоб это с помощью Beautifulsoup. Необходимо сохранить имя файла xml, номер строки, тег xml и его значение во вложенных словарях. Невозможно получить номер строки, пытаясь очистить его с помощью beautifulsoup / lxml. print(linenum) возвращает None, но должен возвращать номер строки в файле XML. Есть идеи?

for xml_file in os.listdir("/Users/abc/Documents/test"):
    mode_map = defaultdict(list)       
    with open("/Users/abc/test/"+xml_file) as raw_resuls:    

        results = BeautifulSoup(raw_resuls, 'lxml')            

        for element in results.find_all("process"):
            attrib = element['mode']                
            if element.find("value") is not None:    
                child = element.find("value").text                    
                linenum= element.find("value").sourceline                    
                print(linenum)                    
                mode_map[attrib].append(child)                    


               # print(mode_map)

        event_map["process"]=mode_map    
        file_map[xml_file]=event_map

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

Вот что у меня сработало!

with open("/Users/abc/Documents/test/"+xml_file) as fin:

        raw_xml = fin.read()

        new_xml="<root>" + raw_xml + "</root>"

        some_file_like = BytesIO(new_xml.encode())

        for event, element in etree.iterparse(some_file_like):
            if element.tag == 'process':
                attrib = element.attrib['mode']
                #print(attrib)
                if element.find("value") is not None:

                    child = element.find("value").text
                    linenum= element.find("value").sourceline
                    print(linenum)
0 голосов
/ 25 июня 2019

Так как я не могу найти ничего лучше, я публикую это как ответ. Просто from lxml import etree как ты привык. Затем сделайте это:

    with open("/Users/abc/test/"+xml_file) as fin:    
        raw_xml = fin.read()
        results = etree.XML('<root>' + raw_xml + '</root>')

Полагаю, вы знаете, что делать дальше, поскольку, похоже, вы знакомы с lxml. Поскольку добавленная мной пара тегов <root>...</root> не сопровождается символом новой строки, они никак не должны влиять на ваш sourceline.

...