python 爬蟲 解析/正则匹配/乱码问题整理

今日爬取一听/扬天音乐都遇到了某些问题,现在对爬取过程中遇到的问题,做对于自己而言较为系统的补充与解释。主要问题有一下几点:

一:beautiful,urllib等库进行网页解析时,对于目标下的东西无法进行解析与显示

二:正则匹配虽然看过许多,但实际使用时仍然不够熟练,需要大量参考,故而,打算重新整理

三:对于乱码问题,曾在建mysql数据库时,头疼多次,现打算对于网页解析的乱码处理方法做些整理

这次目标是爬取扬天音乐“http://up.mcyt.net/”,需要获取的内容有:歌曲名,歌手以及打开浏览器即可播放的音乐链接(格式大致:http://up.mcyt.net/md5/53/******.mp3)

这个任务相对简单,至少在爬虫道路上遇到了又一新情形,故在此稍加叙述。

现在需要爬取截图中的音乐外接,如下图,以及与之对应的web元素

<label>

  <span>音乐外链:</span>

  <input type="text"  name="name"  value="http://up.mcyt.net/md5/53/MTcwMzYwMg_Qq4329912.mp3">

  <br>

  <span>a网页代码:</span>

  <input type="text"  name="name"  onlick="select();"  value="<object height="0" width="0" data="http://up.mcyt.net/p/37823.html"></object>">

<label>

一开始使用的是常规的BeautifulSoup框架进行解析:

response = urlopen(url)

bsObj = BeautifulSoup(response, "html.parser")

li=bsObj.findAll("input",{"type":"text" ,"name":"name"})li=bsObj.findAll("input", {"type": "text" })

print li

但是返回的结果,无法通过li.attrs['value']获取需求的字符串。原因:以上思路对应的网站元素的格式是 

<a  "attr1"=“xxx"  “attr2”="xxx"  "attr3"="xxxx">text</a>

解决方法:

首先解析到<input  "attr1"="xxx"  "attr2"="xxx">的上一层的target,然后再采用正则的方法获取对应的attrs,

def getInfo(html):

  reg=r'value="(.+?.mp3)" '    #传说中的 pattern

  mp3=re.compile(reg)

  mp3list=re.findall(mp3,html)

  return mp3list

现在进入第二部分的整理:正则匹配。

1.Python支持的正则表达式元字符和语法

2.re模块:使用re的一般步骤是先将正则表达式的字符串形式编译为Pattern实例,然后使用Pattern实例处理文本并获得匹配结果(一个Match实例),最后使用Match实例获得信息,进行其他的操作。

import re
# 将正则表达式编译成Pattern对象
pattern = re.compile(r'hello')
# 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None
match = pattern.match('hello world!')
if match:
    # 使用Match获得分组信息
    print match.group()
### 输出 ###
# hello

3.本次使用以上 详细的正则可参考:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html#top 和 相关的拓展:www.cnblogs.com/animalize/p/4949219.html

乱码问题

 1.#coding:utf-8 #.py文件是什么编码就需要告诉python用什么编码去读取这个.py文件。

2.sys.stdout.encoding,默认就是locale的编码,print会用sys.stdout.encoding去encode()成字节流,交给terminal显示。所以locale需要与terminal一致,才能正确print打印出中文。

3.sys.setdefaultencoding(‘utf8’),用于指定str.encode() str.decode()的默认编码,默认是ascii。 

  ~对编码字符串a,代码中可以直接写a.encode(“gbk”),但事实上内部自动先通过defaultencoding 去decode成unicode之后再encode()的。

  • ~str(xxx)应该也是用这个去编码的。
  • ~'ascii' codec can't encode characters in position 7-8: ordinal not in range(128)print的时候出现这个错误一般可以使用这个方案去处理。
  • ~为了避免代码中到处都要去encode(“xxx”),还有可能不同的地方写得不一样带来不一致的情况,推荐使用这个:
import sys   
reload(sys)   
sys.setdefaultencoding('utf8')   

4.判断解析的网页的编码:

 

原文地址:https://www.cnblogs.com/Zhouwl/p/6901225.html