前文提到了Python爬虫框架之一的——Scrapy框架安装和相关命令的简单使用,熟悉了起码的实用流程。今天我们进行一些细节上的总结。如题,在我们要获取目标文本所在的标签时,通常有几种方法,下面我们挨个举例说明各种用法的使用:
以百度贴吧小说吧中的一篇小说为例,我们开始进行爬虫举例,该小说链接为:https://tieba.baidu.com/p/5702862812?pn=1
首先,我们先获取到每一楼的文本标签,代码如下:
# -*- coding: utf-8 -*-
import scrapy
class TbspiderSpider(scrapy.Spider):
name = 'tbSpider'
allowed_domains = ['tieba.baidu.com']
start_urls = ['https://tieba.baidu.com/p/5702862812?pn=1']
def parse(self, response):
# 找到包含每一页的完整内容的标签
page = response.xpath('//div[@class="l_post l_post_bright j_l_post clearfix "]')
# 遍历找到的标签
for content in page:
# 找到每一楼的文本内容,最后放在一个列表中
content_list = content.xpath('.//div[@class="d_post_content j_d_post_content "]').extract()
print('/**********---------++++++++++++++*******/-------------')
print(content_list)
获取到的内容部分结果如下图所示:
由上图可见,获得文本中包含有很多空格和<br>标签,内容杂乱,下面我们开始进行文本内容处理:
1. 使用正则进行处理:
for content in page:
# 找到每一楼的文本内容,最后放在一个列表中
content_list = content.xpath('.//div[@class="d_post_content j_d_post_content "]').extract()[0]
# 使用正则表达式匹配找到的文本内容中的所有s 空格 \n换行 和 <.*?>所有的标签
pattern = re.compile(r'\s|\n|<br>', re.S)
# 将匹配到的内容用空替换,即可以达到去除无关内容只留下文本的目的
content_list = pattern.sub('', content_list)
print('/**********---------++++++++++++++*******/-------------')
print(content_list)
运行后得到如下结果,图中的空格换行和多余的标签都没有了,处理成功.
2. /text()和//text()
/text()和//text()用法一样,都是在获得标签后面写上即可,不过/text()获取的是标签的文本内容, //text()获取标签以及子标签下的文本内容.以/text()为例,具体实现代码如下:
content_list = response.xpath('//div[@class="d_post_content j_d_post_content "]/text()').extract()
print(content_list)
运行结果如下:
3. 使用string('.')
实现代码为:
page_list = response.xpath('//div[@class="l_post l_post_bright j_l_post clearfix "]')
for floor in page_list:
content = floor.xpath('.//div[@class="d_post_content j_d_post_content "]').xpath('string(.)').extract()[0]
content = content.strip(' ')
print(content)
效果如下图所示:
4. 便利标签,获取文本
实现代码如下:
list = response.xpath('//div[@class="l_post l_post_bright j_l_post clearfix "]')
for floor in list:
content_list = floor.xpath('.//div[@class="d_post_content j_d_post_content "]/text()').extract()
content = ''
for value in content_list:
content += value.strip(' ')
print(content)
思路比较简单,遍历所有的标签并从中获取文本,利用字符串的拼接将文本都拼接起来.运行结果如下所示:
总结:使用正则时获取内容比较慢,但是比较美观而且内容处理方便.剩下三种虽然比正则快,但是效果没有正则好,需要后续使用replace()等方法再次进行内容处理,比较麻烦.可以根据情况选择合适的方法进行文本内容获取.