当在文本节中找到“<”或“>”时,Expat无法解析

2024-03-28 14:08:04 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有这样的东西<data>some 'text'</data>,expat解析这个没有问题。
现在如果我有这样一个:<data>'<some text>'</data>它会因为一个不匹配的标记而抓狂,这是因为<被找到了。你知道吗

不幸的是,我不能对所有<>进行转义,因为这样会导致not well-formed,因为不再有开始标记。有什么简单的方法可以解决这个问题吗?我能想到的唯一方法是制作一个正则表达式来转义<>,如果它们在引号中找到的话。你知道吗

编辑:打断它的实际部分:

<script type='text/javascript'>
(function() {
var useSSL = 'https:' == document.location.protocol;
var src = (useSSL ? 'https:' : 'http:') +
'//www.googletagservices.com/tag/js/gpt.js';
document.write('<scr' + 'ipt src="' + src + '"></scr' + 'ipt>');
})();
</script>

Tags: 方法texthttps标记srcdatavarjs
1条回答
网友
1楼 · 发布于 2024-03-28 14:08:04

假设您的坏(X)HTML都与本例一致,那么规则似乎非常明显:您希望将script标记视为cdata。这是无效的,但它提供了一些相对简单的内容,可以在解析页面之前编写并应用于页面。您可以用cdata表示script正文,在脚本正文中用尖括号括起来,或者其他任何您认为合适的内容。然后您将拥有可以成功解析的有效标记(或者您可能只需要处理下一个错误)。(如果不知道除了解析之外您还想对数据做什么,很可能没有人能提出任何更具体的建议。)


您建议的规则“生成一个正则表达式来转义<>(如果它们在引号中找到的话)”,显然行不通。考虑这将如何影响这两个片段:

<div id='normal'>Here is some '<div id='quoted'>quoted</div>' text</div>
<div id='normal'>Here's some '<div id='quoted'>quoted</div>' text</div>

即使你所说的语言不是模棱两可的,它也不会是一种常规语言。你知道吗


另外,值得一问的是,这是否真的是XML。如果是XHTML,则会有其他问题—例如,document.write在XHTML DOM中不存在。它可能是HTML5的XML序列化配置文件,但可能只是HTML5或html4.01,在这种情况下,您不应该首先尝试将其解析为XML。你知道吗


您还可以考虑使用更自由的解析器。尝试^{}使用它知道如何使用的每个解析器(lxml在XML、HTML模式和HTML5模式下,以及html.parserhtml5lib),直到找到一个一致工作的解析器,这可能是一个很好的快速和肮脏的解决方案。你知道吗

相关问题 更多 >