Python3 - добавление каждого символа в строку (создание строки) - PullRequest
1 голос
/ 27 июня 2019

У меня есть элемент XML, который выглядит так:

XML

<page>
    <textline id="1">
        <text>C</text>
        <text>o</text>
        <text>n</text>
        <text>t</text>
        <text>a</text>
        <text>k</text>
        <text>t</text>
    </textline>
    <textline id="2">
        <text>
        </text>
    </textline>
    <textline id="3">
        <text>M</text>
        <text>e</text>
    </textline>
</page>

Я пытаюсь получить все теги <textline> * только 1011 * :

with open(path_to_xml_file) as xml_file:    
     parsed_xml = BeautifulSoup(xml_file, 'xml')
     text_lines = parsed_xml.find_all("textline")

Однако text_lines включает в себя все дочерние элементы <textline> - это означает, что он включает в себя все теги <text></text>.

Кажется, я не могу найти в документации ничего, что объясняет, как выбирать только фактический тег (а не дочерние, дочерние и т. Д.).

Я нашел параметр recursive=False, который должен выбирать только direct children, поэтому я подумал, что могу применить это к тегу page:

text_lines = parsed_xml.find_all("page", recursive=False)

Но это возвращает пустой список: []

Ожидаемый результат:

<textline id="1"></textline>
<textline id="2"></textline>
<textline id="3"></textline>

Ответы [ 3 ]

2 голосов
/ 27 июня 2019

Вы можете установить string=''

Ex:

xml = """<page>
<textline id="1">
  <text>C</text>
  <text>o</text>
  <text>n</text>
  <text>t</text>
  <text>a</text>
  <text>k</text>
  <text>t</text>
</textline>
<textline id="2">
  <text>
  </text>
</textline>
<textline id="3">
  <text>M</text>
  <text>e</text>
</textline>
</page>"""

from bs4 import BeautifulSoup
parsed_xml = BeautifulSoup(xml, 'xml')
text_lines = []
for tag in parsed_xml.find_all("textline"):
    tag.string = ''
    text_lines.append(tag)
print(text_lines)

Выход:

[<textline id="1"></textline>,
 <textline id="2"></textline>,
 <textline id="3"></textline>]
1 голос
/ 27 июня 2019

Вы можете использовать метод clear () , чтобы удалить все внутренние теги <text> из тегов <textline>,

еще одна вещь, которую вы не можете отправить имя файла на BeautifulSoup , вы должны открыть его и отправить содержимое, здесь я сохранил содержимое XML в переменной.

myxml = """<page>
<textline id="1">
  <text>C</text>
  <text>o</text>
  <text>n</text>
  <text>t</text>
  <text>a</text>
  <text>k</text>
  <text>t</text>
</textline>
<textline id="2">
  <text>
  </text>
</textline>
<textline id="3">
  <text>M</text>
  <text>e</text>
</textline>
</page>"""

parsed_xml = BeautifulSoup(myxml, 'xml')
text_lines = parsed_xml.find_all("textline")
for tl in text_lines:
    tl.clear()

print(text_lines)

Выход:

[<textline id="1"/>, <textline id="2"/>, <textline id="3"/>]
0 голосов
/ 27 июня 2019

Я знаю, что изначально пометил этот вопрос beautifulsoup, но я просто хотел поделиться тем, что я на самом деле использовал.Решение от @ Rakesh работает с beaufitulsoup.

Я фактически использовал встроенный синтаксический анализатор Pythons XML:

import xml.etree.ElementTree as ET

tree = ET.parse(path_to_xml_file)
root = tree.getroot()

for textline in root.iter('textline'):
    print(textline)

Я думаю, что это намного чищерешение - так что, надеюсь, это поможет кому-нибудь пройти через этот пост.

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