使用 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)
然后任何更改都会反映在汤中。
我想要做的是将每个标签(无论是 <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)
然后任何更改都会反映在汤中。