python: добавление подэлемента xml к подстроке текста родительского элемента - PullRequest
0 голосов
/ 19 марта 2020

Предположим, у меня есть элемент XML, содержащий текст, и я хочу добавить подэлементы к некоторым словам. Например, для преобразования:

<s>I don't want to have to entertain every Tom, Dick, and Harry who comes through here.</s>

в

<s>I don't want to have to entertain every <name nid="n1">Tom</name>, <name nid="n2">Dick</name>, and <name nid="n3">Harry</name> who comes through here.</s>

У меня есть список всех строк, которые нужно обернуть, и я легко могу найти их расположение в текстовой строке, но я не могу понять, как добавить тег в заданной позиции c (кроме простого создания целого с помощью манипуляции со строками). Конечно, есть лучший способ использовать ElementTree или BeautifulSoup?

1 Ответ

1 голос
/ 19 марта 2020

Я думаю, что это должно дать вам, по крайней мере, большую часть пути туда, куда вы хотите go:

    from bs4 import BeautifulSoup as bs

    old = """
    <s>I don't want to have to entertain every Tom, Dick, and Harry who comes through here.</s>
    """
    names = ["Tom", "Dick", "Harry"]

    soup = bs(old,'lxml')
    orig_tag = soup.s
    old_st_lst = orig_tag.string.split(' ')
    new_st_lst = []
    for ns in old_st_lst:
        t_ns = ns.replace(',','')    
        if t_ns in names:
            place = names.index(t_ns)+1
            new_el = f'<name nid="n{place}">{ns}</name>'
            new_st_lst.append(new_el)        

        else:
            new_st_lst.append(ns)    
    final = ' '.join(new_st_lst)    

    for item in soup.select('s'):
        item.string = final

    print(soup.text)

Вывод:

I don't want to have to entertain every <name nid="n1">Tom,</name> <name nid="n2">Dick,</name> and <name nid="n3">Harry</name> who comes through here.
...