我有以下HTML代码,需要删除其中的script标签和任何与script相关的属性。所谓与script相关的属性是指任何以on开头的属性。
上述内容可以让我接近我所需的内容。是的,我意识到上述正则表达式将抓取从第一个开放脚本标记开始直到最后一个关闭脚本标记的所有内容,但这是一个起始示例。
我非常想使用正则表达式,因为我很熟悉它们(比Python更熟悉),并且我知道这是实现我想要的结果的最快方法,至少对我来说是这样。
因此,我需要帮助去违背我的本性,不要做坏事。我想做坏事并使用正则表达式,所以请有人向我展示光明,并引导我走向非正则表达式的应许之地。
谢谢
更新:
看起来我没有很清楚地说明我的问题,对此我感到抱歉。我的问题是如何使用纯Python解析HTML而不使用正则表达式?
关于上面的代码示例,它是错误的。我知道它是错的,我只是用它作为一个起点的例子。
我希望这能解决我的问题。
更新2
我想补充一些我正在做的事情。
我正在爬取一个网站来获取我需要的数据。
一旦我们有了包含所需数据的页面,它就会被保存到数据库中。
然后将保存的网页显示给用户。
我试图解决的问题发生在这里。当您尝试与强制用户点击确认框的页面交互时,应用程序会抛出脚本错误。该应用程序不是Web浏览器,而是使用Windows中的Web浏览器DLL(我现在无法记住名称)。
所涉及的错误仅在此一个网站的此一个页面上发生。
更新3
添加更新后,我意识到我过度思考了问题,我正在寻找更通用的解决方案。然而,在这种情况下,这并不是所需要的。
<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>
上述内容可以让我接近我所需的内容。是的,我意识到上述正则表达式将抓取从第一个开放脚本标记开始直到最后一个关闭脚本标记的所有内容,但这是一个起始示例。
我非常想使用正则表达式,因为我很熟悉它们(比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的回答是正确的。