文章目录
1. unicode二进制转UTF-8字符
- 1. unicode二进制转UTF-8字符
- 2. Selector
- 2.1 selector的构建
- 2.2 xpath
- 2.2.1 extract()
- 2.2.2 text()
- 2.2.3 基于`@属性`过滤
- 2.2.4 获取`@属性`的值
- 2.3 re
当我们爬虫`print(response.body)时,会出现无法阅读的字符,如下图所示:
从图中可以看出打印出来的字符内容为
b'......'
二进制这种格式的内容,这样的内容我们人类是看不懂的,且编码格式为utf-8
原因和原理:我们知道Python字符串是采用unicode来编码的,全世界各种语言(包含中文)的每一个字符都有唯一对应的一个字符编码,然后采用utf-8的编码方式,将字符编码转换成二进制格式储存在磁盘或在网络传输,所有就会出现我们上图的这种情况
解决和原理 解决的方法就是print(str(response.body, 'utf-8'))
, 将二进制格式的数据转换成utf-8格式的字符,这样我们人类就可以阅读理解了,如下图所示:
Selector的import
from scrapy.selector import Selector
2.1 selector的构建
selector = Selector(text = html_text)
其中html_text是str类型的html elements
2.2 xpath这里我们测试使用网页的html内容如下:
Example website
Name: My image 1
Name: My image 1
Name: My image 2
Name: My image 2
2.2.1 extract()
我们先通过一个简单的例子来了解xpath
contents=selector.xpath("//div/a").extract()
for content in contents:
print(content)
结果如下:
Name: My image 1
Name: My image 1
Name: My image 2
Name: My image 2
可以看到把div标签下的所有a标签都都找出来了,其中//
表示任意起始位置,extract()
将所有符合条件的标签都提取出来,形成list
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 recontents=selector.re('Name: (.+?)')
for content in contents:
print(content)
结果如下:
My image 1
My image 1
My image 2
My image 2
re
将符合条件的多个数据以list返回