您可以使用.find() 和text= 参数,然后使用re/json 模块来解码数据。
例如:
import re
import json
from bs4 import BeautifulSoup
txt = '''
<script type="text/javascript">
$(document).ready(function() {
itemJS.ProductsList({"Status":"true",
"description":"sku_01",
"id": "00000001"
});
});
</script>'''
soup = BeautifulSoup(txt, 'html.parser')
# locate the <script>
t = soup.find('script', text=lambda t: 'ProductsList' in t).contents[0]
# get the raw string using `re` module
json_data = re.search(r'itemJS\.ProductsList\((.*?)\);', t, flags=re.DOTALL).group(1)
# decode the data
json_data = json.loads(json_data)
# print the data to screen
print(json.dumps(json_data, indent=4))
打印:
{
"Status": "true",
"description": "sku_01",
"id": "00000001"
}
编辑:如果你有多个<scipt> 标签,你可以这样做:
import re
import json
from bs4 import BeautifulSoup
txt = '''
<script type="text/javascript">
$(document).ready(function() {
itemJS.ProductsList({"Status":"true",
"description":"sku_01",
"id": "00000001"
});
});
</script>
<script type="text/javascript">
$(document).ready(function() {
itemJS.ProductsList({"Status":"true",
"description":"sku_02",
"id": "00000002"
});
});
</script>
'''
soup = BeautifulSoup(txt, 'html.parser')
for script_tag in soup.find_all('script', text=lambda t: 'ProductsList' in t):
json_data = re.search(r'itemJS\.ProductsList\((.*?)\);', script_tag.contents[0], flags=re.DOTALL).group(1)
json_data = json.loads(json_data)
print(json.dumps(json_data, indent=4))
打印出来:
{
"Status": "true",
"description": "sku_01",
"id": "00000001"
}
{
"Status": "true",
"description": "sku_02",
"id": "00000002"
}