Python爬虫时获取标签内全部文本内容的四种方式

    前文提到了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()等方法再次进行内容处理,比较麻烦.可以根据情况选择合适的方法进行文本内容获取.

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值