Как извлечь текст XML между двумя тегами с указанным значением атрибута, используя красивый суп - PullRequest
0 голосов
/ 11 октября 2018

Добрый день,

Я изучаю Python, а также изучаю XML: как таковой, пожалуйста, прости меня за невежество.

У меня есть XML-документ с текстом, для которого я пытаюсьИзвлеките их в одну строку: в конечном итоге я хочу создать CSV-файл с информацией, извлеченной из атрибутов (в виде столбцов) с текстом, и для каждого «чанка» будет создана новая строка во фрейме данных.

Вот пример XML-файла:

<div type="majorSection">
<p>
<tagname ID="xxx.1.1" sID="xxx.1.1.seID.00002" n="1" />
<w lemma="ref:H75">text I want</w>
<w lemma="ref:H40"> more text I want</w>
<w lemma="ref:H83">and</w>   
punctuation is on this line without any associated tag.
<tagname eID="xxx.1.1.seID.00002" />
<tagname ID="xxx.1.2" sID="xxx.1.2.seID.00003" n="2" />
<w lemma="ref:H75">second line of text I want</w>
and punctuation is on this line without any associated tag ":"    
<w lemma="ref:H8 ref:H14">and again wanted text</w>
with final punctuation line here.
<tagname eID="xxx.1.2.seID.00003" /> 

Я думаю, что понимаю, как это сделать, если меня заинтересовал полный тег "p" (абзац), но я особенно заинтересован втекст между тегами «tagname», где sID начинает чанк, а eID заканчивает чанк той же строки желаний.

, поэтому для приведенного выше примера я бы хотел, чтобы конечный результат выглядел как

- для текста в первой строке - «текст, я хочу больше текста, который я хочу, и пунктуация в этой строке без какого-либо связанного тега»(это из sID = xxx.1.1.seID.00002)

- для текста второй строки - "вторая строка текста, которую я хочу, и пунктуация в этой строке без какого-либо связанного тега: и снова требуемый текстс последней пунктуацией здесь. "(это из sID = xxx.1.2.seID.00003)

В конечном итоге я хотел бы иметь столбец в конце фрейма данных для идентификации источника, и в этом случае первая запись строки будет иметь «xxx», «1», «1» и вторая запись строки будут иметь «xxx», «1», «2».

, поэтому конец будет иметь четыре столбца: book, chapterNum, textNum, textChar

это то, что у меня пока есть, но я не уверен, как сохранить textChar в одной строке без разрывов строк, и я не уверен, как получить другую информацию из значений атрибута sID, которые я хочу, и поместить все этов фрейм данных.

for i in soup.find_all('div'):
if i.get('type')=='majorSection':
    for j in i.find_all('p'):
        for tag in j.find_all('w'):
            textChar = tag.text + tag.next_sibling
            print(textChar)

Я смотрел на это решение безрезультатно: Как получить весь текст между двумя указанными тегами, используя BeautifulSoup?

Спасибоза ваше терпение со мной.Мне нужно многому научиться в области интеллектуального анализа текста с помощью Python, и я очень рад это сделать, но после этих двух последних дней я зашел в тупик.

1 Ответ

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

После долгих трудов вот решение, которое мне удалось собрать.Я уверен, что есть гораздо более эффективные способы сделать это, но я не знаю ни одного из них: к сожалению.

 verseID = tagvalue
            node = soup.find('tagname', {'sID': tagvalue})
            s = []
            while True:
                if node is None:
                    break
                node = node.next_sibling
                if hasattr(node, "eID") and node.get('eID') == tagvalue:
                    break
                else:
                    if node is not None and hasattr(node, 'text'):
                        if hasattr(node, 'type') and node.get('type') == 'value i do not want':
                            break
                        else:
                            s.append(node.text)
                    else:
                        if hasattr(node, 'type') and node.get('type') == 'value i do not want':
                            break
                        else:
                            s.append(node)
            textChar = ''.join(s)
            textChar = textChar.replace("\n", " ")

Для полноты на случай, если кто-то еще увидит это: мне удалось собрать это изответы в этой теме: BeautifulSoup - Как получить весь текст между двумя разными тегами?

Спасибо.

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