Я пытаюсь очистить некоторые данные с помощью 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)
используйте .text
для получения содержимого внутри <script>
затем замените dataLayer =
raw_data = soup.find("script")
raw_data = raw_data.text.replace('dataLayer =', '')
json_dict = json.loads(raw_data)
>>> import re
>>> soup.find_all(re.compile("\[(.*?)\]"))
вы сделали бы это с регулярным выражением
Вам нужно будет создать норму регулярных выражений, которая требует только текста между []
здесь ссылка общего использования регулярных выражений в beautifulsoup
здесь регулярное выражение для извлечения из квадратных скобок