regex - 将字符串格式化为 XML 文件
问题描述
我想将字符串重新格式化为 XML 结构,但我的字符串不是 XML 格式(使用 Python 2.7)。我相信正确的方法是首先在一行中创建输入的 XML 格式,然后使用 XML Pretty Print 使其成为具有多行和缩进的 XML 文件( Pretty printing XML in Python)。
下面是一个历史服务器 REST API 调用 Hadoop 服务器1之后的输入示例。输入:
'{"jobAttempts":{"jobAttempt":[{"nodeHttpAddress":"slave2:8042","nodeId":"slave2:39637","id":1,"startTime":1544691730439,"containerId":"container_1544631848492_0013_01_000001","logsLink":"http://23.22.43.90:19888/jobhistory/logs/slave2:39637/container_1544631848492_0013_01_000001/job_1544631848492_0013/hadoop2"}]}}'
输出:
'<jobAttempts><jobAttempt><nodeHttpAddress>slave2:8042</nodeHttpAddress><nodeId>slave2:39637</nodeId><id>1</id><startTime>1544691730439</startTime><containerId>container_1544631848492_0013_01_000001</containerId><logsLink>http://23.22.43.90:19888/jobhistory/logs/slave2:39637/container_1544631848492_0013_01_000001/job_1544631848492_0013/hadoop2</logsLink></jobAttempt></jobAttempts>'
最终输出
<jobAttempts>
<jobAttempt>
<nodeHttpAddress>slave2:8042</nodeHttpAddress>
<nodeId>slave2:39637</nodeId>
<id>1</id>
<startTime>1544691730439</startTime>
<containerId>container_1544631848492_0013_01_000001</containerId>
<logsLink>http://23.22.43.90:19888/jobhistory/logs/slave2:39637/container_1544631848492_0013_01_000001/job_1544631848492_0013/hadoop2</logsLink>
</jobAttempts>
</jobAttempt>
*此字符串实际上是一个 XML 文件,似乎没有任何与之关联的样式信息。
解决方案
我发现 History Server REST API 的源视图确实是一行中的 XML 文件。因此,我必须阅读源视图,而不是使用 python 的旧有问题的视图。在我使用之前
import urllib2
contents = urllib2.urlopen("http://http://23.22.43.90:19888/ws/v1/history/mapreduce/jobs/job_1544631848492_0013//jobattempts").read()
现在,我正在下载带有 selenium 和 BeautifulSoup 的 html 页面的源视图,并将其保存在本地。
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import xml.dom.minidom
driver = webdriver.Firefox()
driver.get("http://23.22.43.90:19888/ws/v1/history/mapreduce/jobs/job_1544631848492_0013/jobattempts")
page_source = driver.page_source
driver.close()
soup = BeautifulSoup(page_source, "html.parser")
print(soup)
xml = xml.dom.minidom.parseString(str(soup))
pretty_xml_as_string = xml.toprettyxml()
file = open("./content_new_2.xml", 'w')
file.write(pretty_xml_as_string)
file.close()
推荐阅读
- reactjs - 在 Material-UI 中如何使文本字段处于只读状态时不可以点击
- javascript - 使用 puppeteer 的 page.eval 函数上的未定义变量
- javascript - 从类别中查询项目
- node.js - HyperLedger Fabric 获取区块信息 - 使用 node.js
- c - 使用 Fork() 在 C 中的 TCP 并发客户端/服务器
- python - 在python中的条形图上的条形上方添加值
- sql - SQL NOT 日期之间(包括 NULL)
- javascript - 如何在 React Native 中将函数和数据从组件类传递到无状态类?
- django - 设置环境变量后,我的 Django 项目中仍然出现 KeyError: 'SECRET_KEY'
- ruby-on-rails - Rails附件不持久