#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