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

时间:2016-05-20 19:45:49

标签: python beautifulsoup html-parsing

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

我尝试使用漂亮的汤,但它只找到我定义的标签......

我在HTMLparser.py中找到了一些代码

tagfind = re.compile('([a-zA-Z][^\t\n\r\f />\x00]*)(?:\s|/(?!>))*')

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

我还想我可以使用:

handle_starttag(self, tag, attrs):

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

这可能吗?

感谢您的帮助!!

2 个答案:

答案 0 :(得分:1)

更可靠的方法是以递归方式访问每个标记,我只是在下面的示例中更改了名称,但是一旦有了标记,就可以执行任何操作:

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)

然后任何变化都会反映在汤中。

答案 1 :(得分:0)

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

此外,正则表达式似乎不是一个非常好的(仅匹配内部标签而不是整个标签本身)所以我发现了一个更适合的正则你的目的:

</?\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@