【问题标题】:Change ALL html tags to symbol using python使用python将所有html标签更改为符号
【发布时间】:2016-05-20 19:45:49
【问题描述】:

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

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

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

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

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

我还想我可以使用:

handle_starttag(self, tag, attrs):

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

这可能吗?

感谢大家的帮助!!

【问题讨论】:

  • 标签很多。你的最终目标是什么?
  • 从 HTML 中删除每个标签并用符号替换它们
  • 我的意思是你为什么要这样做?

标签: python beautifulsoup html-parsing


【解决方案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)

那么任何变化都会反映在汤里。

【讨论】:

  • @HarpAngell,你在说什么标签?您只需将汤传递给函数并在找到标签时做任何您想做的事情,在一些 html 上运行代码,然后在之后打印汤
  • 你说“一旦你有标签”,但现在我意识到你的意思是一旦脚本有标签
  • 一旦if isinstance(s, element.Tag) 为True,你就有一个标签,所以每个s 都是if/else 中的标签,你可以用它做任何你喜欢的事情,它会比正则表达式可靠得多
  • url = os.path.abspath('test.html') sock = urllib.urlopen(url).read() 汤 = BeautifulSoup(sock,'html.parser') 汤 = 访问(汤)打印汤
  • 它发生在原地,不要分配只是对汤对象的调用访问
【解决方案2】:

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@

【讨论】:

  • @HarpAngell 没问题!请记住接受对您有帮助的答案。
  • 只是在打印功能上缺少一个结尾),但它有效!!
  • @HarpAngell 该标签已为我替换。能否请您发布一个 Pastebin 链接,指向不起作用的完整 HTML?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
  • 2020-07-06
  • 1970-01-01
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多