使用 python 将所有 html 标签更改为符号

Change ALL html tags to symbol using python

我想要做的是将每个标签(无论是 <a href=><title></title></div>... 等)更改为一个符号。

我尝试使用 beautiful soup 但它只能找到我定义的标签...

我在 HTMLparser.py

中找到了一些代码
tagfind = re.compile('([a-zA-Z][^\t\n\r\f />\x00]*)(?:\s|/(?!>))*')

我相信这就是我要找的东西我只是不知道如何正确使用它。

我还想我可以使用:

handle_starttag(self, tag, attrs):

但我不想定义标签,我只想让脚本找到每个标签并将其更改为某些内容...

这可能吗?

感谢大家的帮助!!

BeautifulSoup 在这里不是一个好主意 - 它是为 解析 HTML 而设计的,而不是编辑它。

此外,那个正则表达式似乎不是一个很好的正则表达式(只匹配内容 inside 一个标签而不是整个标签本身)所以我找到了一个不同的会更适合您的目的:

</?\w+((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[\^'">\s]+))?)+\s*|\s*)/?>

此标签将匹配以下内容:

<h1>
</h1>
<img src="foo.com/image.png">

我们可以使用它来替换所有使用 re.sub 的标签。这会找到某个正则表达式的所有匹配项,并将它们替换为其他内容。以下是您如何使用它来完成您想做的事情:

import re

html_regex = r"""</?\w+((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[\^'">\s]+))?)+\s*|\s*)/?>"""
html = "<h1>Foo</h1>"

print(re.sub(html_regex, "@", html))

这将打印:

@Foo@

一种更可靠的方法是递归访问每个标签,我只是在下面的示例中更改了名称,但是一旦有了标签,您就可以做任何您想做的事情了:

from bs4 import BeautifulSoup, element

def visit(s):
    if isinstance(s, element.Tag):
        has_children = s.find_all()
        if has_children:
            s.name = "foobar"
            for child in s:
                visit(child)
        else:
            s.name = "foobar"

使用方法:

 soup = BeautifulSoup(...)
 visit(soup)

然后任何更改都会反映在汤中。