Как получить доступ к контенту в теге скрипта с помощью bs4 - PullRequest
1 голос
/ 06 марта 2019

Я новичок в python, и я пытаюсь использовать красивый суп, чтобы найти тег сценария на странице, на которой есть dataLayer, а затем получить значение postNo и напечатать его.

  <head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/js/bootstrap.min.js"></script>

<!-- Data Layer - Begin -->
<script>
  dataLayer = [
    {
      'country': 'UnitedKingdom',
      'site': 'Blog',
      'postNo': '34',
      'pageType': 'Home',
      'pageType2': 'Blog',
      'pageType3': 'Top Tips'
    }
  ];
</script>
<!-- Data Layer - End -->
  </head>

Любая помощь илиуказатели будут высоко оценены.Спасибо

Ответы [ 2 ]

1 голос
/ 06 марта 2019
import requests
import bs4
import json




html = '''
  <head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/js/bootstrap.min.js"></script>

<!-- Data Layer - Begin -->
<script>
  dataLayer = [
    {
      'country': 'UnitedKingdom',
      'site': 'Blog',
      'postNo': '34',
      'pageType': 'Home',
      'pageType2': 'Blog',
      'pageType3': 'Top Tips'
    }
  ];
</script>
<!-- Data Layer - End -->
  </head>'''


soup = bs4.BeautifulSoup(html, 'html.parser')

scripts = soup.find_all('script')
for script in scripts:
    if 'dataLayer = ' in script.text:

        jsonStr = script.text.strip()
        jsonStr = jsonStr.split('[')[1].strip()
        jsonStr = jsonStr.split(']')[0].strip()
        jsonStr = jsonStr.replace("'", '"')

        jsonObj = json.loads(jsonStr)

print (jsonObj['postNo'])

Выход:

print (jsonObj['postNo'])
34
0 голосов
/ 06 марта 2019

Просто вытащите список из html и разберите, просто. Смотрите код ниже.

from bs4 import BeautifulSoup
import ast
html = '''
<head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/js/bootstrap.min.js"></script>

<!-- Data Layer - Begin -->
<script>
  dataLayer = [
    {
      'country': 'UnitedKingdom',
      'site': 'Blog',
      'postNo': '34',
      'pageType': 'Home',
      'pageType2': 'Blog',
      'pageType3': 'Top Tips'
    }
  ];
</script>
<!-- Data Layer - End -->
  </head>'''

soup = BeautifulSoup(html, 'html.parser')
content = soup.findAll('script')[2].text.replace(';','').replace('dataLayer = ','').strip()
data = ast.literal_eval(content)
print([x['postNo'] for x in data])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...