首页 新闻 会员 周边 捐助

Python爬虫抓取当当网图片时,正则表达式没有匹配到链接地址

-1
[已解决问题] 解决于 2017-10-26 13:43

最近正在学Python爬虫,从最基础的学起,即用 urllib 和 re 这两个包学抓取。

用教材(韦玮《精通Python网络爬虫》)第77页的方法爬京东的图片完全没问题,但想照猫画个虎,爬一下当当网儿童图书版块的图片,却怎么也行不通,用正则表达式做的 pattern,死活就是没有匹配到任何链接地址。

当当网初始页面:http://category.dangdang.com/pg1-cp01.41.26.00.00.00.html

求大神指正!

 

 1 import re, urllib.request
 2 
 3 def craw(url, page):
 4     s = str(urllib.request.urlopen(url).read())
 5     p = "<img data-original='(.+?)'"
 6     lnks = re.findall(p, s)
 7     t = re.search(p, s)
 8     
 9     x = 1
10     for lnk in lnks:
11         fname = 'D:/Python/ddIMGs/book_kid/' + str(page) + '-' + str(x)
12         try:
13             urllib.request.urlretrieve(lnk, filename=fname)
14         except urllib.error.URLError as e:
15             if hasattr(e, 'code'):
16                 x += 1
17             if hasattr(e, 'reason'):
18                 x += 1
19         x += 1
20 
21 for i in range(1, 2):
22     url = 'http://category.dangdang.com/pg' + str(i) + '-cp01.41.26.00.00.00.html'
23     craw(url, i)
木木卡卡西的主页 木木卡卡西 | 菜鸟二级 | 园豆:208
提问于:2017-10-04 21:53
< >
分享
最佳答案
1

修改第4、5两行如下,貌似就解决问题了:

1     s = str(urllib.request.urlopen(url).read().decode(encoding='gbk'))
2     p = re.compile("<img data-original='(.+?)'", re.S)

编码真的是个麻烦的问题,正则表达式也是,看来得多练习才行!

木木卡卡西 | 菜鸟二级 |园豆:208 | 2017-10-08 00:59
其他回答(1)
-1

如果s是正确的话,那应该能找得到。

urllib.request.urlopen(url).read().decode(encoding='utf8')这才对。

墨镜带佬星 | 园豆:2310 (老鸟四级) | 2017-10-04 22:18

不行啊,直接报错如下:

Traceback (most recent call last):
  File "D:\Python\20171004_58pic_jieqi.py", line 23, in <module>
    craw(url, i)
  File "D:\Python\20171004_58pic_jieqi.py", line 4, in craw
    s = str(urllib.request.urlopen(url).read().decode(encoding='utf8'))
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa1 in position 244: invalid start byte

奇怪的是,类似的代码,对京东就管用……

支持(0) 反对(0) 木木卡卡西 | 园豆:208 (菜鸟二级) | 2017-10-05 10:36

@木木卡卡西: 当当网页用的是GB2312,encoding='gb18030' 和 GB2312 试试。

支持(0) 反对(0) 墨镜带佬星 | 园豆:2310 (老鸟四级) | 2017-10-06 05:39

@codegay: 还是不行。不管了,肯定是我代码哪里没写对。先这样,等学完了,再回过头来检查下代码。

支持(0) 反对(0) 木木卡卡西 | 园豆:208 (菜鸟二级) | 2017-10-06 15:36

@木木卡卡西: str(bytes)肯定没错。decode报这样错很正常。应该是网页里有一些字符python不能解码才会这样。

支持(0) 反对(0) 墨镜带佬星 | 园豆:2310 (老鸟四级) | 2017-10-07 08:43

@codegay: 唉,编码真是讨厌的大问题……

支持(0) 反对(0) 木木卡卡西 | 园豆:208 (菜鸟二级) | 2017-10-07 08:52

@木木卡卡西: 还有,你换成requests试试。这个库特别棒。接口友好,还会自动解码的。

支持(0) 反对(0) 墨镜带佬星 | 园豆:2310 (老鸟四级) | 2017-10-07 09:33

@codegay: 好像书上后面会讲到。等学到这里的时候再回来看看,原生的库还是先打好基础再说~

支持(0) 反对(0) 木木卡卡西 | 园豆:208 (菜鸟二级) | 2017-10-07 21:15

@codegay: 另外,想再请教个问题:我用 decode('gbk') 解码了一个网页,汉字基本没问题了,但有个“•”号仍然打印为“&#8226;”。有啥办法能给还原为“•”或“·” 等别的字符吗?

支持(0) 反对(0) 木木卡卡西 | 园豆:208 (菜鸟二级) | 2017-10-07 22:07

@木木卡卡西: 这些是unicode字符了吧。处理后,chr(8226)可以。

支持(0) 反对(0) 墨镜带佬星 | 园豆:2310 (老鸟四级) | 2017-10-08 15:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册