Python scrapy的reponse数据解析

1. unicode二进制转UTF-8字符

当我们爬虫`print(response.body)时,会出现无法阅读的字符,如下图所示:

unicode二进制从图中可以看出打印出来的字符内容为b'......'二进制这种格式的内容,这样的内容我们人类是看不懂的,且编码格式为utf-8

原因和原理:我们知道Python字符串是采用unicode来编码的,全世界各种语言(包含中文)的每一个字符都有唯一对应的一个字符编码,然后采用utf-8的编码方式,将字符编码转换成二进制格式储存在磁盘或在网络传输,所有就会出现我们上图的这种情况

解决和原理
解决的方法就是print(str(response.body, 'utf-8')), 将二进制格式的数据转换成utf-8格式的字符,这样我们人类就可以阅读理解了,如下图所示:
UTF-8字符

2. Selector

Selector的import

from scrapy.selector import Selector

2.1 selector的构建

selector = Selector(text = html_text)

其中html_text是str类型的html elements

2.2 xpath

这里我们测试使用网页的html内容如下:

<html>
 <head>
  <base href='http://example.com/' />
  <title>Example website</title>
 </head>
 <body>
  <div id='images'>
   <a href='image1.html'>Name: My image 1</a>
   <a href='image1.html'>Name: My image 1</a>
   <a href='image2.html'>Name: My image 2</a>
   <a href='image2.html'>Name: My image 2</a>
  </div>
 </body>
</html>

2.2.1 extract()

我们先通过一个简单的例子来了解xpath

contents=selector.xpath("//div/a").extract()
for content in contents:
    print(content)

结果如下:

<a href="image1.html">Name: My image 1 <br><img src="image1_thumb.jpg"></a>
<a href="image1.html">Name: My image 1 <br><img src="image1_thumb.jpg"></a>
<a href="image2.html">Name: My image 2 <br><img src="image2_thumb.jpg"></a>
<a href="image2.html">Name: My image 2 <br><img src="image2_thumb.jpg"></a>

可以看到把div标签下的所有a标签都都找出来了,其中//表示任意起始位置,extract()将所有符合条件的标签都提取出来,形成list

2.2.2 text()

contents=selector.xpath("//div/a/text()").extract()
for content in contents:
    print(content)

结果如下:

Name: My image 1 
Name: My image 1 
Name: My image 2 
Name: My image 2

可以看到只获取了元素的内容,而没有标签了

2.2.3 基于@属性过滤

contents=selector.xpath("//div/a[@href='image1.html']/text()").extract()
for content in contents:
    print(content)

结果如下:

Name: My image 1 
Name: My image 1

可以看到只获取到了a标签下属性href等于image1.html的内容

2.2.4 获取@属性的值

contents=selector.xpath("//div/a/@href").extract()
for content in contents:
    print(content)

结果如下:

image1.html
image1.html
image2.html
image2.html

可以看到获取到了属性href的值

2.3 re

contents=selector.re('Name: (.+?)</a>')
for content in contents:
    print(content)

结果如下:

My image 1
My image 1
My image 2
My image 2

re将符合条件的多个数据以list返回

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值