Использование find
для получения узла, в который вы хотите вставить:
top_xml = ET.fromstring("<a><b1><array><c1></c1></array></b1><b2></b2></a>")
bottom_xml = ET.fromstring("<f><g><h2></h2><h1></h1></g></f>")
insert_node = top_xml.find('.//c1')
insert_node.append(bottom_xml)
Тогда результат будет:
In [31]: print(ET.tostring(top_xml).decode())
<a><b1><array><c1><f><g><h2 /><h1 /></g></f></c1></array></b1><b2 /></a>
Это работает, так какобъект, извлеченный с помощью find, все еще является частью корневого объекта, и любые сделанные вами мутации отражаются обратно на корневой объект.
Подробнее о xpath
выражениях, поддерживаемых с помощью find, можно найти здесь
Если вы хотите что-то более продвинутое, я предлагаю использовать lxml
Редактировать
Исходя из вашего вопроса, который вы хотите вставить во второй элемент, вы можете использовать [position]
Например:
insert_node = top_xml.find('.//c1[2]')
Результат:
In [73]: print(ET.tostring(top_xml).decode())
<a><b1><array><c1 /><c1><f><g><h2 /><h1 /></g></f></c1><c1 /></array></b1><b2 /></a>