首页 > 解决方案 > 用漂亮的汤从网站上刮掉一串文本

问题描述

我想抓取一个网页并返回 GTM(谷歌标签管理器)容器 ID(下面的示例中它将是 GTM-5LS3NZ)。代码不应该寻找确切的容器 ID,而是寻找模式,因为我将在多个站点上使用它。

到目前为止,我可以搜索头部并打印包含 GTM 的整段文本,但我不知道如何将查找和正则表达式一起格式化以仅返回 GTM-5LS3NZ(在此示例中)。

import urllib3
import re
from bs4 import BeautifulSoup

http = urllib3.PoolManager()

response = http.request('GET', "https://www.observepoint.com/")
soup = BeautifulSoup(response.data,"html.parser")

GTM = soup.head.findAll(text=re.compile(r'GTM'))
print(GTM)

注意:GTM ID 可以包含 6 或 7 个字母数字字符,因此我希望容器 ID 的正则表达式类似于 ^GTM-[A-Z0-9] - 我不知道如何指定 6 或 7 个字符。

澄清我所追求的。如果你运行上面的代码,你会得到以下结果。

["(function (w, d, s, l, i) {\n      w[l] = w[l] || [];\n      w[l].push({\n        'gtm.start': new Date().getTime(),\n        event: 'gtm.js'\n      });\n      var f = d.getElementsByTagName(s)[0],\n        j = d.createElement(s),\n        dl = l != 'dataLayer' ? '&l=' + l : '';\n      j.async = true;\n      j.src =\n        'https://www.googletagmanager.com/gtm.js?id=' + i + dl;\n      f.parentNode.insertBefore(j, f);\n    })(window, document, 'script', 'dataLayer', 'GTM-5LS3NZ');"]

我想要的只是 GTM-5LS3NZ。

标签: pythonbeautifulsoupgoogle-tag-manager

解决方案


几天前我做了类似的事情,快速重写给了我:

import urllib3
import re
from bs4 import BeautifulSoup

http = urllib3.PoolManager()

response = http.request('GET', "https://www.observepoint.com/")
soup = BeautifulSoup(response.data,"html.parser")

pattern  =re.compile(r'GTM-([a-zA-Z0-9]{6,7})')
found = soup.head.find(text=pattern)
if found:
    match = pattern.search(found)
    if match:
        print(match.group(1))

这给了我 GTM-5LS3NZ 作为输出。


推荐阅读