我正在使用BeautifulSoup和Requests抓取一些网站。我正在检查的页面的<script language="JavaScript" type="text/javascript">标签中包含其数据。看起来像这样:
<script language="JavaScript" type="text/javascript">
<script language="JavaScript" type="text/javascript"> var page_data = { "default_sku" : "SKU12345", "get_together" : { "imageLargeURL" : "http://null.null/pictures/large.jpg", "URL" : "http://null.null/index.tmpl", "name" : "Paints", "description" : "Here is a description and it works pretty well", "canFavorite" : 1, "id" : 1234, "type" : 2, "category" : "faded", "imageThumbnailURL" : "http://null.null/small9.jpg" ......
有没有一种方法可以通过page_data此脚本标签内的变量创建python字典或json对象?这比尝试通过BeautifulSoup获取值要好得多。
page_data
如果您使用BeautifulSoup获取<script>标签的内容,则该json模块可以使用一些字符串魔术来完成其余的工作:
<script>
json
jsonValue = '{%s}' % (textValue.partition('{')[2].rpartition('}')[0],) value = json.loads(jsonValue)
上面的.partition()和.rpartition()组合在JavaScript文本块中的第一个{和最后一个文本上进行了拆分},这应该是您的对象定义。通过将花括号添加回文本,我们可以将其输入json.loads()并从中获取python结构。
.partition()
.rpartition()
{
}
json.loads()
之所以可行,是因为JSON 基本上 是Javascript文字语法对象,数组,数字,布尔值和null。
示范:
>>> import json >>> text = ''' ... var page_data = { ... "default_sku" : "SKU12345", ... "get_together" : { ... "imageLargeURL" : "http://null.null/pictures/large.jpg", ... "URL" : "http://null.null/index.tmpl", ... "name" : "Paints", ... "description" : "Here is a description and it works pretty well", ... "canFavorite" : 1, ... "id" : 1234, ... "type" : 2, ... "category" : "faded", ... "imageThumbnailURL" : "http://null.null/small9.jpg" ... } ... }; ... ''' >>> json_text = '{%s}' % (text.partition('{')[2].rpartition('}')[0],) >>> value = json.loads(json_text) >>> value {'default_sku': 'SKU12345', 'get_together': {'imageLargeURL': 'http://null.null/pictures/large.jpg', 'URL': 'http://null.null/index.tmpl', 'name': 'Paints', 'description': 'Here is a description and it works pretty well', 'canFavorite': 1, 'id': 1234, 'type': 2, 'category': 'faded', 'imageThumbnailURL': 'http://null.null/small9.jpg'}} >>> import pprint >>> pprint.pprint(value) {'default_sku': 'SKU12345', 'get_together': {'URL': 'http://null.null/index.tmpl', 'canFavorite': 1, 'category': 'faded', 'description': 'Here is a description and it works pretty ' 'well', 'id': 1234, 'imageLargeURL': 'http://null.null/pictures/large.jpg', 'imageThumbnailURL': 'http://null.null/small9.jpg', 'name': 'Paints', 'type': 2}}