首页 > 解决方案 > 检查转义序列形式的 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. &lt;b&gt;Bailly&lt;/b&gt; (Jean-Sylvain), astronome, maire de Paris. L. sig.,"/>
                  <String CONTENT="155. &lt;b&gt;Barbier&lt;/b&gt; (l’abbé H.), auteur de la &lt;i&gt;Biographie du clergé con¬&lt;/i&gt;"/>
                  <String CONTENT="&lt;b&gt;&lt;i&gt;Salle du premier&lt;/i&gt;&lt;/b&gt;"/>

               ...
</alto>

其中包含以下转义序列,替换预先注释的 HTML 标记:

请注意,输入文件还包含嵌套标签:

我应该验证转义序列形式的标签格式是否正确,以便每个打开标签都有一个相应的结束标签,如果不是这种情况,程序需要指示错误。

我试图通过用相应的转义序列替换尖括号来调整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('&lt;[bi]&gt;')
        if ltag > -1:
            rtag = line.find('&lt;\/[bi]&gt;')
            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&lt;/b&gt; (Jean-Sylvain), astronome, maire de Paris. L. sig.,"/> ----------> # it fails to indicate the error for the 'Bailly&lt;/b&gt;'

INPUT LINE:                   <String CONTENT="155. &lt;b&gt;Barbier&lt;/b&gt; (l’abbé H.), auteur de la &lt;i&gt;Biographie du clergé con¬&lt;/i&gt;"/>

INPUT LINE:                   <String CONTENT="&lt;b&gt;&lt;i&gt;Salle du premier&lt;/i&gt;&lt;/b&gt;"/>

INPUT LINE: 

INPUT LINE:                ...

INPUT LINE: </alto>

关于如何改进我的代码的任何建议?

标签: pythonxml

解决方案


您继承了一个混乱的 XML 设计。

以下是您如何完成任务的草图,即注意当前存储为 XML 属性的重构 XML 标记的格式良好:

  1. 如果整个 XML 文档的格式不正确,请应用如何解析无效(错误/格式不正确)XML 中给出的技术?使整个 XML 文档格式正确。

  2. 使用 XML 解析器检索每个包含转义 XML 的属性值。对于每个这样的属性值,

    1. 词法&lt;上用<&gt;替换>。这假设所有&lt;&gt;现在都是标签的一部分。
    2. 将重构的属性值包装在一个虚拟根元素中,并开始对该临时 XML 文档进行新的 XML 解析。
    3. 报告任何格式正确的错误。
    4. 如果其中一些&lt;and&gt;是独立的,而不是标签的一部分,那么再次使用如何解析无效(错误/格式不正确)XML 中给出的技术?修理。

如果可能的话,首先重新设计您的 XML,不要将标记存储在属性值中;这样的设计从根本上是有缺陷的,并会导致诸如您当前遇到的问题。


推荐阅读