Как получить доступ к значениям XML, которые не находятся внутри тега body, с помощью BeautifulSoup

#xml #beautifulsoup

#xml #beautifulsoup

Вопрос:

Вот базовый пример XML, в котором теги заключены во внешний тег

 from bs4 import BeautifulSoup

data = """<?xml version="1.0" encoding="UTF-8"?>
<note>
    <to> Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
</note>
"""

soup = BeautifulSoup(data, 'xml')
print([tag.name for tag in soup.find_all()])
 

Вывод

 ['note', 'to', 'from', 'heading', 'body']
 

Но этот второй пример больше похож на мой XML-файл, где теги не заключены во внешний тег

 data = """<?xml version="1.0" encoding="UTF-8"?>
    <to> Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
"""
soup = BeautifulSoup(data, 'xml')
print([tag.name for tag in soup.find_all()])
 

Вывод только

 ['to']
 

Как мне получить доступ к значениям [‘to’, ‘from’, ‘heading’, ‘body’] из XML-файла, подобного второму примеру?

Это данные, которые я пытаюсь прочитать

 <?xml version="1.0" encoding="utf-8"?>
<rows>
 3
</rows>
<cols>
 3
</cols>
<dt>
 d
</dt>
<data>
 [[1.45757244e 03 0.00000000e 00 1.21294569e 03]
 [0.00000000e 00 1.45752223e 03 1.00732059e 03]
 [0.00000000e 00 0.00000000e 00 1.00000000e 00]]
</data>
 

Ответ №1:

Ваш XML недопустим, у него должен быть один root , поэтому, если вы можете его изменить, вы должны получить свой результат.

Но в любом случае, вы можете изменить синтаксический анализатор на lxml / html, чтобы отобразить весь документ целиком

 soup = BeautifulSoup(data, 'lxml')
print([tag for tag in soup.find('body').findChildren()]) #tags including text
print([tag.text.strip() for tag in soup.find('body').findChildren()]) #only text 
 

Выходные теги

 [<rows>
 3
</rows>, <cols>
 3
</cols>, <dt>
 d
</dt>, <data>
 [[1.45757244e 03 0.00000000e 00 1.21294569e 03]
 [0.00000000e 00 1.45752223e 03 1.00732059e 03]
 [0.00000000e 00 0.00000000e 00 1.00000000e 00]]
</data>]
 

Выходные тексты

 ['3', '3', 'd', '[[1.45757244e 03 0.00000000e 00 1.21294569e 03]n [0.00000000e 00 1.45752223e 03 1.00732059e 03]n [0.00000000e 00 0.00000000e 00 1.00000000e 00]]']
 

Комментарии:

1. Я нахожусь ниже по потоку от источника данных, поэтому сейчас мне нужно обработать XML-файл как есть. Спасибо за ваш ответ. Я добавлю только следующую команду, которая обращается к данным. print(«rows =», soup.find(‘body’).find(«строки»).text.strip())

2. Как преобразовать soup.find(‘body’).find(«data»).text.strip()) в числовой массив с плавающими значениями

3. Попробуйте выполнить следующее или откройте новый вопрос my_array = np.array([tag for tag in soup.find('body').find('rows').text.split()],dtype='float64') my_array.dtype