Извлечение данных из <script> с Beautifulsoup

1

Я пытаюсь очистить некоторые данные с помощью Python и Beautifulsoup. Я знаю, как получить текст из тега скрипта. Данные между [] действительны json.

<script>
    dataLayer = 
[  
  {  
  "p":{  
         "t":"text1",
         "lng":"text2",
         "vurl":"text3"
       },
  "c":{  },
  "u":{  },
  "d":{  },
  "a":{  }
  }
]
</script>

Я прочитал этот ответ, и он почти делает то, что я хочу: Извлеките содержимое <Script with BeautifulSoup

Вот мой код:

import urllib.request
from bs4 import BeautifulSoup
import json

url = "www.example.com"
html = urllib.request.urlopen(url)
soup = BeautifulSoup(html, "html.parser")
raw_data = soup.find("script")

Тогда я бы идеально сделал:

json_dict = json.loads(raw_data)

И получить доступ к данным через словарь. Но это не работает из-за

"<script> dataLayer =" 

предшествующий действительному json и тегу script в конце. Я пробовал обрезать raw_data как строку, например:

raw_data[20:]

Но это не сработало, потому что суп-объект не является строкой.

Как я могу заставить переменную raw_data содержать ТОЛЬКО текст между кавычками блока []?

EDIT: похоже, это работает. Он избегает регулярного выражения и решает проблему хвостов. Спасибо за ваши предложения.

url = "www.example.com"
html = urllib.request.urlopen(url)
soup = BeautifulSoup(html, "html.parser")

# get the script tag data and convert soup into a string
data = str(soup.find("script"))

# cut the <script> tag and some other things from the beginning and end to get valid JSON
cut = data[27:-13]

# load the data as a json dictionary
jsoned = json.loads(cut)
  • 0
    Можете ли вы предоставить URL?
  • 0
    Нам нужно знать, в каком теге скрипта это находится, чтобы обеспечить точный результат.
Теги:
beautifulsoup

2 ответа

0

используйте .text для получения содержимого внутри <script> затем замените dataLayer =

raw_data = soup.find("script")
raw_data = raw_data.text.replace('dataLayer =', '')
json_dict = json.loads(raw_data)
0
>>> import re
>>> soup.find_all(re.compile("\[(.*?)\]"))

вы сделали бы это с регулярным выражением

Вам нужно будет создать норму регулярных выражений, которая требует только текста между []

здесь ссылка общего использования регулярных выражений в beautifulsoup

здесь регулярное выражение для извлечения из квадратных скобок

  • 0
    Спасибо, но это не работает. re_soup = soup.find_all (re.compile ("[(. *?]]")), а затем: data = json.loads (re_soup) и затем: print (data) дает "TypeError: объект JSON должен быть str , байты или bytearray, а не ResultSet "
  • 0
    во-первых, ваше регулярное выражение неверно, вы забыли убрать квадратные скобки
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню