从HTML中删除脚本标签和on属性

4
我有以下HTML代码,需要删除其中的script标签和任何与script相关的属性。所谓与script相关的属性是指任何以on开头的属性。
<body>
<script src="...">

    </script>
<div onresize="CreateFixedHeaders()" onscroll="CreateFixedHeaders()" id="oReportDiv" style="overflow:auto;WIDTH:100%">

<script type="text/javascript" language="javascript">

//&lt;![CDATA[

function CreateFixedHeaders() {}//]]&gt;
</script>
<script>

            var ClientReportfb64a4706a3749c484169e...
        </script>
</body>

我的第一个想法是使用BeautifulSoup来删除标签和属性。不幸的是,我无法使用BeautifulSoup。既然无法使用BeautifulSoup,我可以看到两个选项来解决这个问题。我看到的第一个选项是根据索引拆分字符串并进行解析。对我来说,这似乎是一个不好的解决方案。

另一个选择是使用正则表达式。然而,我们知道这也不是一个好的解决方案(Cthulhu Parsing)。

现在考虑到这一点,我个人认为使用正则表达式删除属性是可以的。毕竟,这仍然是简单的字符串操作。

因此,要删除属性,我有:

script_attribute_regex = r'\son[a-zA-Z]+="[a-zA-Z0-0\.;\(\)_]+"'
result = re.sub(script_attribute_regex, "", page_source)

正如我之前所说,我个人认为上述使用正则表达式与HTML是完全可以接受的。但我仍然希望对上述用法获得一些意见。

然后就有了脚本标签的问题。我非常想使用正则表达式来解决这个问题,因为我知道它们并且我知道我所需要的东西非常简单。类似于:

<script(.*)</script>

上述内容可以让我接近我所需的内容。是的,我意识到上述正则表达式将抓取从第一个开放脚本标记开始直到最后一个关闭脚本标记的所有内容,但这是一个起始示例。
我非常想使用正则表达式,因为我很熟悉它们(比Python更熟悉),并且我知道这是实现我想要的结果的最快方法,至少对我来说是这样。
因此,我需要帮助去违背我的本性,不要做坏事。我想做坏事并使用正则表达式,所以请有人向我展示光明,并引导我走向非正则表达式的应许之地。
谢谢
更新:
看起来我没有很清楚地说明我的问题,对此我感到抱歉。我的问题是如何使用纯Python解析HTML而不使用正则表达式?
<script(.*)</script>

关于上面的代码示例,它是错误的。我知道它是错的,我只是用它作为一个起点的例子。
我希望这能解决我的问题。
更新2
我想补充一些我正在做的事情。
我正在爬取一个网站来获取我需要的数据。
一旦我们有了包含所需数据的页面,它就会被保存到数据库中。
然后将保存的网页显示给用户。
我试图解决的问题发生在这里。当您尝试与强制用户点击确认框的页面交互时,应用程序会抛出脚本错误。该应用程序不是Web浏览器,而是使用Windows中的Web浏览器DLL(我现在无法记住名称)。
所涉及的错误仅在此一个网站的此一个页面上发生。
更新3
添加更新后,我意识到我过度思考了问题,我正在寻找更通用的解决方案。然而,在这种情况下,这并不是所需要的。

该页面是动态生成的,但脚本标签将保持静态。考虑到这一点,解决方案变得更加简单。因此,我不再需要将其视为HTML,而是作为静态字符串处理。

所以我正在寻找的解决方案是

import re


def strip_script_tags(page_source: str) -> str:
    pattern = re.compile(r'\s?on\w+="[^"]+"\s?')
    result = re.sub(pattern, "", page_source) 
    pattern2 = re.compile(r'<script[\s\S]+?/script>')
    result = re.sub(pattern2, "", result)
    return result

我希望避免使用正则表达式,但由于只能使用标准库的正则表达式,在这种情况下似乎是最好的解决方案。这意味着@skamazin的回答是正确的。


尝试阅读这个帖子(https://dev59.com/42w15IYBdhLWcg3wWqj-?rq=1),我认为它可以帮助你。 - Tomás Cot
很遗憾,那是JavaScript,我正在尝试使用Python完成这个。我知道BeautifulSoup有一个类似于JS的API,并且可以以这种方式使用它。但是,我不能使用BeautifulSoup,我需要使用纯Python。如果Python有与此相同风格的DOM API,我可以使其起作用,但我不知道除了BeautifulSoup之外还有什么东西可以为您提供JS样式的DOM API。如果我错了,请纠正我。或者您是在谈论从该帖子中提取的jquery中提取的Regex吗? - user3752226
@user3752226,我在谈论正则表达式的答案。 - Tomás Cot
1
为什么不能使用BeautifulSoup,"纯Python"对你来说意味着什么?据我所知,BeautifulSoup是用纯Python编写的,没有C扩展。你是指仅标准库吗? - Jason S
实际上,我需要修改我的观点,只有旧的py2兼容的BeautifulSoup是一个文件。 - Jason S
显示剩余3条评论
1个回答

4

如果要移除以on开头的所有属性,您可以尝试这个

它使用的是正则表达式:

\s?on\w+="[^"]+"\s?

将其替换为空字符串(删除)。因此,在Python中应该是:

pattern = re.compile(ur'\s?on\w+="[^"]+"\s?')
subst = u""
result = re.sub(pattern, subst, file) 

如果你想匹配


谢谢你的正则表达式技巧。然而,我的问题不是关于使用正则表达式。我的问题是如何在不使用正则表达式的情况下解析脚本标签。 - user3752226
哦!我不够了解Python,无法帮助你,但我可以指引你这个方向。如果这不能帮到你,我很抱歉,但我看到很多人都建议使用这种方法来处理标签问题。 - skamazin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接