python - 检查转义序列形式的 HTML 标签是否格式正确
问题描述
我正在使用 ALTO-XML 文件:
<?xml version="1.0" encoding="UTF-8"?>
<alto xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.loc.gov/standards/alto/ns-v2#"
xmlns:page="http://schema.primaresearch.org/PAGE/gts/pagecontent/2013-07-15"
xsi:schemaLocation="http://www.loc.gov/standards/alto/ns-v2# http://www.loc.gov/standards/alto/alto.xsd">
...
<String CONTENT="154. <b>Bailly</b> (Jean-Sylvain), astronome, maire de Paris. L. sig.,"/>
<String CONTENT="155. <b>Barbier</b> (l’abbé H.), auteur de la <i>Biographie du clergé con¬</i>"/>
<String CONTENT="<b><i>Salle du premier</i></b>"/>
...
</alto>
其中包含以下转义序列,替换预先注释的 HTML 标记:
<b></b>
而不是<b></b>
;<i></i>
而不是<i></i>
;
请注意,输入文件还包含嵌套标签:
<b><i></i></b>
而不是<b><i></i></b>
.
我应该验证转义序列形式的标签格式是否正确,以便每个打开标签都有一个相应的结束标签,如果不是这种情况,程序需要指示错误。
我试图通过用相应的转义序列替换尖括号来调整此b
代码,包括用于匹配字母和的正则表达式i
:
stack = []
import re
with open("1856_10_LAV_N03-2.txt", 'r') as parse_file:
for line in parse_file:
print ("INPUT LINE:", line)
ltag = line.find('<[bi]>')
if ltag > -1:
rtag = line.find('<\/[bi]>')
if rtag > -1:
# Found left and right brackets: grab tag
tag = line[ltag: rtag]
open_tag = tag[0] != '/'
if open_tag:
# Add tag to stack
stack.append(tag)
print ("TRACE open", stack)
else:
tag = tag[1:]
if len(stack) == 0:
print ("No blocks are open; tried to close", tag)
else:
if stack[-1] == tag:
# Close the block
stack.pop()
print ("TRACE close", tag, stack)
else:
print ("Tried to close", tag, "but most recent open block is", stack[0])
if tag in stack:
stack.remove(tag)
print ("Prior block closed; continuing")
if len(stack):
print ("Blocks still open at EOF:", stack)
但是,它只生成输入行,没有任何错误消息,即使标签格式不正确:
INPUT LINE: <?xml version="1.0" encoding="UTF-8"?>
INPUT LINE: <alto xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
INPUT LINE: xmlns="http://www.loc.gov/standards/alto/ns-v2#"
INPUT LINE: xmlns:page="http://schema.primaresearch.org/PAGE/gts/pagecontent/2013-07-15"
INPUT LINE: xsi:schemaLocation="http://www.loc.gov/standards/alto/ns-v2# http://www.loc.gov/standards/alto/alto.xsd">
INPUT LINE: ...
INPUT LINE: <String CONTENT="154. Bailly</b> (Jean-Sylvain), astronome, maire de Paris. L. sig.,"/> ----------> # it fails to indicate the error for the 'Bailly</b>'
INPUT LINE: <String CONTENT="155. <b>Barbier</b> (l’abbé H.), auteur de la <i>Biographie du clergé con¬</i>"/>
INPUT LINE: <String CONTENT="<b><i>Salle du premier</i></b>"/>
INPUT LINE:
INPUT LINE: ...
INPUT LINE: </alto>
关于如何改进我的代码的任何建议?
解决方案
您继承了一个混乱的 XML 设计。
以下是您如何完成任务的草图,即注意当前存储为 XML 属性的重构 XML 标记的格式良好:
如果整个 XML 文档的格式不正确,请应用如何解析无效(错误/格式不正确)XML 中给出的技术?使整个 XML 文档格式正确。
使用 XML 解析器检索每个包含转义 XML 的属性值。对于每个这样的属性值,
- 词法
<
上用<
和>
替换>
。这假设所有<
和>
现在都是标签的一部分。 - 将重构的属性值包装在一个虚拟根元素中,并开始对该临时 XML 文档进行新的 XML 解析。
- 报告任何格式正确的错误。
- 如果其中一些
<
and>
是独立的,而不是标签的一部分,那么再次使用如何解析无效(错误/格式不正确)XML 中给出的技术?修理。
- 词法
如果可能的话,首先重新设计您的 XML,不要将标记存储在属性值中;这样的设计从根本上是有缺陷的,并会导致诸如您当前遇到的问题。
推荐阅读
- python - 从字符串值创建列表时出现属性错误
- wordpress - 如何更改 Woocommerce 管理员面包屑链接标题
- angular - 使用谷歌地图没有输入地址时如何设置当前位置
- keras - 如何管理活动轮廓损失的多标签分割图?
- azure - 用于管理 Azure 资源的 Azure PIM
- jsp - 如何使用jsp页面隐藏url中的传递参数
- java - SpringBoot - 使用 fly-saucer-pdf 结果生成 pdf 到空文件中
- django - 如何针对具有 id 的对象创建对象
- java - 引起:java.lang.RuntimeException: Parcelable 遇到 IOException 读取 Serializable 对象
- ios - 是否有一个 swift 库可以让您自定义 JSON 中键的顺序?