Соскрести строку текста с сайта с красивым супом - PullRequest
0 голосов
/ 23 апреля 2019

Я хотел бы очистить веб-страницу и просто вернуть идентификатор контейнера GTM (в приведенном ниже примере это будет GTM-5LS3NZ).Код не должен искать точный идентификатор контейнера, а скорее образец, так как я буду использовать его на нескольких сайтах.

До сих пор я мог искать голову и печатать весь фрагмент текста, содержащий 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 может содержать 6 или 7 буквенно-цифровых символов, поэтому я ожидаю, чторегулярное выражение для идентификатора контейнера должно быть что-то вроде ^ 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.

Ответы [ 3 ]

1 голос
/ 23 апреля 2019

Несколько дней назад я сделал нечто подобное, и быстрое переписывание дает мне:

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 в качестве вывода.

1 голос
/ 23 апреля 2019

Я уже разобрался, благодаря помощи в комментариях.Это то, что я был после:

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(re.search("GTM-[A-Z0-9]{6,7}",str(GTM))[0])
0 голосов
/ 23 апреля 2019

Вы также можете извлечь из соответствующего комментария

import requests
from bs4 import BeautifulSoup, Comment

r = requests.get('https://www.observepoint.com/')
soup = BeautifulSoup(r.content, 'lxml')
for comment in soup.findAll(text=lambda text:isinstance(text, Comment)):
    if 'iframe' in comment:
        soup = BeautifulSoup(comment, 'lxml')
        id = soup.select_one('iframe')['src'].split('=')[1]
        print(id)
        break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...