查看: 383|回复: 7
打印 上一主题 下一主题

[求助] 请问有什么办法可以去除词典文件中多余的html闭合标签?

[复制链接]
  • TA的每日心情
    慵懒
    4 天前
  • 签到天数: 606 天

    [LV.9]以坛为家II

    8

    主题

    736

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    13070
    跳转到指定楼层
    1
    发表于 2020-7-4 18:07:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    比如这种:
    1. <div>123</div></div>
    复制代码

    当然这个只是最简单的例子,实际应用当中会有更复杂的嵌套关系,我尝试用正则,感觉无解。
    我知道html tidy可以去除多余标签,可是它同时会格式化代码并且添加常规html所需的一些标签,而那些标签对于mdx来说是多余的。所以想问问有没有办法只去除多余标签不做其他的改动。
  • TA的每日心情
    奋斗
    2019-10-13 07:34
  • 签到天数: 209 天

    [LV.7]常住居民III

    73

    主题

    1552

    回帖

    9万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    96973

    QQ 章笑傲江湖章灌水大神章推广专家

    2
    发表于 2020-7-4 18:52:16 | 只看该作者
    ### Tidy 格式化 mdx 源文件技巧

    若采用默认 tidy 配置,mdx 源文件 tidy 后会出现如下问题:

    - Q1:添加了`<html><head></head></html>`等不必要的内容,造成 mdx 语法及词条内容错误
    - Q2:无法识别 mdx 标签</>,并将其转化为可读性差的 HTML entities `&lt;/&gt;`
    - Q3:将 keyword 与上下行合并,造成 mdx 语法及词条内容错误

    解决方案:

    Q1:配置 tidy configy.txt 文件:

        show-body-only: yes

    Q2 和 Q3:

    1. 需暂时变换</>和关键字,以便 Tidy 正确识别

        "将</>替换为<mdx/>\r<keyword>
        :%s/<\/>\n/<mdx\/>\r<keyword>/
        "在关键字的最后添加</keyword>
        :%s/\v(\<keyword\>)(.*)/\1\2\<\/keyword\>/

    2. 配置 Tidy 的 configy.txt 文件:

        new-empty-tags: mdx
        new-blocklevel-tags: keyword

    3. 执行 Tidy,最后将输出的文件恢复为 mdx 语法格式

        " 将<mdx />恢复为</>
        :%s/<mdx \/>/<\/>/
        " 将<keyword>和</keyword>删除
        :%s/<\%[/]keyword>//g
  • TA的每日心情
    奋斗
    2019-10-13 07:34
  • 签到天数: 209 天

    [LV.7]常住居民III

    73

    主题

    1552

    回帖

    9万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    96973

    QQ 章笑傲江湖章灌水大神章推广专家

    3
    发表于 2020-7-4 18:54:30 | 只看该作者
    //HTML Tidy 5.6.0 Options for mdx

    //请特别关注以下选项
    //show-body-only, output-xhtml
    //quiet, indent, tidy-mark, wrap
    //break-before-br
    //logical-emphasis
    //hide-comments
    //new-blocklevel-tags
    //new-empty-tags

    //Document Display Options
    gnu-emacs: no
    markup: yes
    mute:
    mute-id: no
    quiet: yes
    show-body-only: yes
    show-errors: 6
    show-info: yes
    show-warnings: yes

    //Document In and Out Options
    add-meta-charset: no
    add-xml-decl: no
    add-xml-space: no
    doctype: auto
    input-xml: no
    output-html: no
    output-xhtml: yes
    output-xml: no

    //File Input-Output Options
    error-file:
    keep-time: no
    output-file:
    write-back: no

    //Diagnostics Options Reference
    accessibility-check: 0
    force-output: no
    show-meta-change: no
    warn-proprietary-attributes: yes

    //Encoding Options Reference
    char-encoding: utf8
    input-encoding: utf8
    newline: CRLF
    output-bom: auto
    output-encoding: utf8

    //Cleanup Options Reference
    bare: no
    clean: yes
    drop-empty-elements: yes
    drop-empty-paras: yes
    drop-proprietary-attributes: no
    gdoc: no
    logical-emphasis: yes
    merge-divs: auto
    merge-spans: auto
    word-2000: no

    //Entities Options Reference
    ascii-chars: no
    ncr: yes
    numeric-entities: no
    preserve-entities: no
    quote-ampersand: no
    quote-marks: no
    quote-nbsp: yes

    //Repair Options Reference
    alt-text:
    anchor-as-name: yes
    assume-xml-procins: no
    coerce-endtags: yes
    css-prefix: c
    custom-tags: no
    enclose-block-text: no
    enclose-text: no
    escape-scripts: no
    fix-backslash: yes
    fix-bad-comments: auto
    fix-style-tags: yes
    fix-uri: yes
    literal-attributes: no
    lower-literals: yes
    repeated-attributes: keep-last
    skip-nested: yes
    strict-tags-attributes: no
    uppercase-attributes: no
    uppercase-tags: no

    //Transformation Options Reference
    decorate-inferred-ul: no
    escape-cdata: no
    hide-comments: no
    join-classes: no
    join-styles: yes
    merge-emphasis: yes
    replace-color: no

    //Teaching Tidy Options Reference
    new-blocklevel-tags: keyword
    new-empty-tags: mdx
    new-inline-tags:
    new-pre-tags:

    //Pretty Print Options Reference
    break-before-br: yes
    indent: auto
    indent-attributes: no
    indent-cdata: no
    indent-spaces: 4
    indent-with-tabs: no
    keep-tabs: no
    tab-size: 4
    omit-optional-tags: no
    priority-attributes:
    sort-attributes: none
    punctuation-wrap: no
    tidy-mark: no
    vertical-space: no
    wrap: 0
    wrap-asp: yes
    wrap-attributes: no
    wrap-jste: yes
    wrap-php: yes
    wrap-script-literals: no
    wrap-sections: yes
  • TA的每日心情
    无聊
    2021-1-15 05:13
  • 签到天数: 271 天

    [LV.8]以坛为家I

    11

    主题

    471

    回帖

    6760

    积分

    会元

    Rank: 7Rank: 7Rank: 7

    积分
    6760

    灌水大神章

    4
    发表于 2020-7-5 02:00:19 | 只看该作者
    本帖最后由 EarthWorm 于 2020-8-5 05:30 编辑

    EmEditor 自带一个特殊的功能: 高亮闭合标签内容. 配合简单的宏, 可以在代码量最少的情况下完成你所需的任务

    说实话, 这是一种比较笨的办法, 效率低下还有可能程序失去响应, 如果编辑的文件比较大, 程序会处于假死状态, 不要动电脑, 正常情况下会跑完的. 高级点的办法可以用 Python 的 bs4 库来完成, 那个我就没法帮你了, 我只是知道它可以处理, 怎么做你得自己查资料, 我也得现学...
  • TA的每日心情
    慵懒
    4 天前
  • 签到天数: 606 天

    [LV.9]以坛为家II

    8

    主题

    736

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    13070
    5
     楼主| 发表于 2020-7-5 11:08:06 | 只看该作者
    本帖最后由 preachers 于 2020-7-5 12:52 编辑
    VimVim 发表于 2020-7-4 18:54
    //HTML Tidy 5.6.0 Options for mdx

    //请特别关注以下选项

    我用这个config文件处理词典的文本,它确实去掉了多余的闭合标签,不过它也会去掉一些似乎有用的标签,比如:
    1. <div class='even'><div></div><div colspan='2' class='FrEx'>I'll be back in two or three minutes.</div></div>
    复制代码

    变成:
    1. <div colspan='2' class='FrEx'>I'll be back in two or three minutes.</div>
    复制代码

    我不知道在原来的词典文件中这个叫even的class是不是在css里面会有什么特殊用途,不过感觉它这样删标签还是可能会影响最后的结果。
    另外很重要的一点是,经过tidy处理的html会被格式化,本来没有多少行的代码会被拆分成好多好多行(我测试的文档里面源文件是189行,过了tidy后变成了655行),这样的文件如果在emeditor里面再做处理是很崩溃的。
  • TA的每日心情
    慵懒
    4 天前
  • 签到天数: 606 天

    [LV.9]以坛为家II

    8

    主题

    736

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    13070
    6
     楼主| 发表于 2020-7-5 11:25:07 | 只看该作者
    EarthWorm 发表于 2020-7-5 02:00
    EmEditor 自带一个特殊的功能: 高亮闭合标签内容. 配合简单的宏, 可以在代码量最少的情况下完成你所需的任 ...

    谢谢你的建议,我对emeditor的macro不太熟,不过根据你提供的代码我查了查reference,大概明白了你这段的意思,你是根据一个opening tag来找closing tag然后删掉后者,如果我理解没错的话,这个功能并不是我所需要的,因为我要删除的是单独多出来的closing tag,而不是能跟一个opening tag配成一对的。

    至于python我也不太会,我玩的是powershell + c#的路子,不过你能提供bs4库解决这个问题的基本逻辑吗?如果可以的话我也可以用同样的逻辑寻找c#的对应处理办法。
  • TA的每日心情
    奋斗
    2019-10-13 07:34
  • 签到天数: 209 天

    [LV.7]常住居民III

    73

    主题

    1552

    回帖

    9万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    96973

    QQ 章笑傲江湖章灌水大神章推广专家

    7
    发表于 2020-7-5 19:58:32 | 只看该作者
    preachers 发表于 2020-7-5 11:08
    我用这个config文件处理词典的文本,它确实去掉了多余的闭合标签,不过它也会去掉一些似乎有用的标签,比 ...

    join-styles: no

    tidy的配置很灵活的,你的所有问题都有答案。
  • TA的每日心情
    慵懒
    4 天前
  • 签到天数: 606 天

    [LV.9]以坛为家II

    8

    主题

    736

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    13070
    8
     楼主| 发表于 2020-7-6 13:13:54 | 只看该作者
    本帖最后由 preachers 于 2020-7-6 13:18 编辑
    VimVim 发表于 2020-7-5 19:58
    join-styles: no

    tidy的配置很灵活的,你的所有问题都有答案。

    恩,我把tidy的配置说明基本看了一遍,把配置文件已经改成这样了
    1. //Document Display Options
    2. gnu-emacs: no
    3. markup: yes
    4. mute:
    5. mute-id: no
    6. quiet: yes
    7. show-body-only: yes
    8. show-errors: 6
    9. show-info: yes
    10. show-warnings: yes

    11. //Document In and Out Options
    12. add-meta-charset: no
    13. add-xml-decl: no
    14. add-xml-space: no
    15. doctype: auto
    16. input-xml: no
    17. output-html: no
    18. output-xhtml: yes
    19. output-xml: no

    20. //File Input-Output Options
    21. error-file:
    22. keep-time: no
    23. output-file:
    24. write-back: no

    25. //Diagnostics Options Reference
    26. accessibility-check: 0
    27. force-output: no
    28. show-meta-change: no
    29. warn-proprietary-attributes: yes

    30. //Encoding Options Reference
    31. char-encoding: utf8
    32. input-encoding: utf8
    33. newline: CRLF
    34. output-bom: auto
    35. output-encoding: utf8

    36. //Cleanup Options Reference
    37. bare: no
    38. clean: no
    39. drop-empty-elements: no
    40. drop-empty-paras: no
    41. drop-proprietary-attributes: no
    42. gdoc: no
    43. logical-emphasis: no
    44. merge-divs: no
    45. merge-spans: no
    46. word-2000: no

    47. //Entities Options Reference
    48. ascii-chars: no
    49. ncr: yes
    50. numeric-entities: no
    51. preserve-entities: no
    52. quote-ampersand: no
    53. quote-marks: no
    54. quote-nbsp: yes

    55. //Repair Options Reference
    56. alt-text:
    57. anchor-as-name: no
    58. assume-xml-procins: no
    59. coerce-endtags: no
    60. css-prefix: c
    61. custom-tags: no
    62. enclose-block-text: no
    63. enclose-text: no
    64. escape-scripts: no
    65. fix-backslash: no
    66. fix-bad-comments: auto
    67. fix-style-tags: no
    68. fix-uri: no
    69. literal-attributes: no
    70. lower-literals: no
    71. repeated-attributes: keep-last
    72. skip-nested: no
    73. strict-tags-attributes: no
    74. uppercase-attributes: no
    75. uppercase-tags: no

    76. //Transformation Options Reference
    77. decorate-inferred-ul: no
    78. escape-cdata: no
    79. hide-comments: no
    80. join-classes: no
    81. join-styles: no
    82. merge-emphasis: no
    83. replace-color: no

    84. //Teaching Tidy Options Reference
    85. new-blocklevel-tags: keyword
    86. new-empty-tags: mdx
    87. new-inline-tags:
    88. new-pre-tags:

    89. //Pretty Print Options Reference
    90. break-before-br: no
    91. indent: no
    92. indent-attributes: no
    93. indent-cdata: no
    94. indent-spaces: 4
    95. indent-with-tabs: no
    96. keep-tabs: no
    97. tab-size: 4
    98. omit-optional-tags: no
    99. priority-attributes:
    100. sort-attributes: none
    101. punctuation-wrap: no
    102. tidy-mark: no
    103. vertical-space: no
    104. wrap: 0
    105. wrap-asp: no
    106. wrap-attributes: no
    107. wrap-jste: no
    108. wrap-php: no
    109. wrap-script-literals: no
    110. wrap-sections: no
    复制代码


    基本上能变成no的全变成no了。之前去掉的一些标签确实得以保留,但是最崩溃的还是它把行数分成那么多,这个我找遍配置参数也没找到能改变这个的。
    虽然这个换行的问题其实可以在处理之后用正则再替换回来,但是很麻烦,如果我想保留词典源文件本来的换行规则的话几乎是不可能的,我只能选择把每个词条都变成一整行,所以如果tidy本身能设置成保留原来的格式是最好的。