我想要做的是将每个标记(无论是<a href=>
或<title>
或</title>
还是</div>
...等)更改为符号。
我尝试使用漂亮的汤,但它只找到我定义的标签......
我在HTMLparser.py中找到了一些代码
tagfind = re.compile('([a-zA-Z][^\t\n\r\f />\x00]*)(?:\s|/(?!>))*')
我相信这就是我正在寻找的我只是不知道如何正确使用它。
我还想我可以使用:
handle_starttag(self, tag, attrs):
但我不想定义标签,我只是希望脚本找到每个标签并将其更改为某些内容......
这可能吗?
感谢您的帮助!!
答案 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@