Crossin的编程教室

标题: requests获取网页代码解析的时候json.loads出问题 [打印本页]

作者: mayixb    时间: 2018-1-23 22:10
标题: requests获取网页代码解析的时候json.loads出问题
爬的是今日头条里面的图片,但是在这个网页里面出问题了
https://www.toutiao.com/a6514108163745120771/

snap3496.jpg

很明显,图片是包含在这个里面的,这是json

但是这个里面有一个反斜杠,搞不清楚是为什么?

image_pattern = re.compile('gallery: JSON.parse(.*?)siblingList', re.S)
img = re.findall(image_pattern, response.text)

用了一个正则把这个字符串给提取出来,提取出来的是一个列表

snap3497.jpg

由于前面多了些括号,而且里面有个反斜杠,所以对这个字符串进行了处理

img[0].replace('\\','').strip()[2:-3]

再转换json对象的时候出错

data=json.loads(img[0].replace('\\','').strip()[2:-3])

snap3498.jpg

分析的那个字符串发现的问题

snap3499.jpg

把这段更改一下程序就可以执行下去,网页中看到了问题所在

snap3500.jpg

是这个引号出问题了,不知道该怎么解决,抓了前十页的图,就这个地方出问题了,折腾了我一天,新手遇到问题没有办法呀



作者: zhaolehua    时间: 2018-1-24 09:49
def parse_page_detail(html,url): #解析子页面
    soup = BeautifulSoup(html,'lxml')
    title = soup.select('title')[0].get_text()
    #print(title)
    images_pattern = re.compile('gallery: JSON.parse\((.*?)\),\n',re.S)
    result = re.search(images_pattern,html)
    if result:
        #print(result.group(1))
        data = json.loads(result.group(1)) #loads方法应该是把json对象转化为字典,但这里不知道为什么成了字符串对象?
        data = eval(data)  # 将字符串对象转化为字典,用eval或exec方法。
        if data and 'sub_images' in data.keys():
            sub_images = data.get('sub_images')
            #print(sub_images)
            images = [item.get('url') for item in sub_images]
            #print(images)
            for image in images:
                image = image.replace('\\','')
                #print(image)
                download_image(image)
            return {
                'title':title,
                'url':url,
                'images':images

                }

给你参考一下
作者: mayixb    时间: 2018-1-24 14:33
zhaolehua 发表于 2018-1-24 09:49
def parse_page_detail(html,url): #解析子页面
    soup = BeautifulSoup(html,'lxml')
    title = soup. ...

兄弟 谢谢了,已经弄好了,是在正则的地方出问题了 ,又学了一招,感谢

snap3501.jpg
作者: zhaolehua    时间: 2018-1-24 15:30
loads方法应该是把json对象转化为字典,但这里不知道为什么成了字符串对象?
你知道这是怎么回事吗?
你把你loads后的数据type()一下看看是什么类型
作者: mayixb    时间: 2018-1-25 15:24
zhaolehua 发表于 2018-1-24 15:30
loads方法应该是把json对象转化为字典,但这里不知道为什么成了字符串对象?
你知道这是怎么回事吗?
你把 ...

是str,这个不晓得怎么回事




欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5