文章目录
1. unicode二进制转UTF-8字符
当我们爬虫`print(response.body)时,会出现无法阅读的字符,如下图所示:
从图中可以看出打印出来的字符内容为
b'......'
二进制这种格式的内容,这样的内容我们人类是看不懂的,且编码格式为utf-8
原因和原理:我们知道Python字符串是采用unicode来编码的,全世界各种语言(包含中文)的每一个字符都有唯一对应的一个字符编码,然后采用utf-8的编码方式,将字符编码转换成二进制格式储存在磁盘或在网络传输,所有就会出现我们上图的这种情况
解决和原理
解决的方法就是print(str(response.body, '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返回