HTML 从html标签中删除“no-js”类,添加“js”类
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTML 从html标签中删除“no-js”类,添加“js”类相关的知识,希望对你有一定的参考价值。
从 HTML 中删除脚本标签和属性
【中文标题】从 HTML 中删除脚本标签和属性【英文标题】:Remove Script tag and on attributes from HTML 【发布时间】:2014-09-27 01:45:49 【问题描述】:我有以下 HTML,我需要删除 HTML 中的脚本标签和任何与脚本相关的属性。与脚本相关的属性是指任何以 on 开头的属性。
<body>
<script src="...">
</script>
<div onresize="CreateFixedHeaders()" onscroll="CreateFixedHeaders()" id="oReportDiv" style="overflow:auto;WIDTH:100%">
<script type="text/javascript" language="javascript">
//<![CDATA[
function CreateFixedHeaders() //]]>
</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>
以上将开始让我接近我需要的东西。是的,我意识到上面的 RegEx 将从第一个开始脚本标签开始抓取所有内容,直到最后一个结束脚本标签,但这是一个开始的例子。
我很想使用正则表达式,因为我对它们很熟悉(比 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 的回答是正确的。
【问题讨论】:
试试this线程,我想它可以帮助你。 @TomasCot 不幸的是,这是 JavaScript,我正在尝试在 Python 中执行此操作。我知道 BeautifulSoup 有一个类似于 JS 的 API,可以这样使用它。但是,我不能使用 BeautifulSoup,我需要为此使用纯 Python。如果 Python 具有与此相同风格的 DOM API,我可以让它工作,但我不知道除了 BeautifulSoup 之外的任何东西,它可以为您提供 JS 风格的 DOM API。如果我不正确,请纠正我。或者您是在与该帖子中从 jquery 中提取的正则表达式交谈吗? @user3752226 好像你知道你在用正则表达式做什么,那么关于<script(.*)</script>
的问题是什么?您是否要删除/修改某些内容?也许我在您的问题中错过了它,但是除了删除以字符串 "on"
开头的属性之外,您还需要做什么似乎并不清楚
@user3752226,我说的是正则表达式的答案。
你为什么不能使用 BeautifulSoup,“纯 python”对你意味着什么? BeautifulSoup 是用纯 python 编写的,据我所知,它没有 C 扩展。你的意思是标准库吗?
【参考方案1】:
至于去掉所有以on
开头的属性,可以试试this
它使用正则表达式:
\s?on\w+="[^"]+"\s?
并用空字符串替换(删除)。所以在 Python 中应该是:
pattern = re.compile(ur'\s?on\w+="[^"]+"\s?')
subst = u""
result = re.sub(pattern, subst, file)
如果您尝试匹配脚本标签之间的任何内容,请尝试:
<script[\s\S]+?/script>
DEMO
您的正则表达式的问题在于该点 (.
) 与换行符不匹配。使用补集将匹配每个可能的字符。并确保在[\s\S]+?
中使用?
,使其变得懒惰而不是贪婪。
【讨论】:
感谢您提供 RegEx 提示。但是,我的问题不是关于使用 RegEx。我的问题是如何在不使用正则表达式的情况下解析脚本标签。 哦!我不知道足够多的 Python 来帮助你,但我可以在 this direction 中指出你。如果这没有帮助,我很抱歉,但我看到很多人建议使用这种方法来解决标签问题。以上是关于HTML 从html标签中删除“no-js”类,添加“js”类的主要内容,如果未能解决你的问题,请参考以下文章
html 这在ie特定样式的情况下提供了html标签上的类。注意:Modernizr在加载时用“js”替换“no-js”。如果你
JavaScript - 用“js”类替换“no-js”类不起作用?