以在scrapy框架抓取百度贴吧为例,介绍四种抓取文本的方式。
1. 获取最外层标签,遍历内部所有的子标签“/text()”,获取标签文本
class XiaoshuoSpider(scrapy.Spider):
name = 'xiaoshuo'
allowed_domains = ['tieba.baidu.com']
start_urls = ['https://tieba.baidu.com/p/5815118868']
f= open('content.txt','a',encoding='utf-8')
def parse(self, response):
div_list = response.xpath('//div[@class="l_post l_post_bright j_l_post clearfix "]')
for div in div_list:
author = div.xpath('.//div[@class="louzhubiaoshi_wrap"]').getall()
if len(author) != 0:
content_list = div.xpath('.//div[@class="d_post_content j_d_post_content "]/text()').getall()
content = ''
remove = re.compile('\s')
douhao = re.compile(',')
for string in content_list:
string = re.sub(remove,'',string)
string = re.sub(douhao,'',string)
content+=string+'\n'
print(content)
self.f.write(content)
其中以下代码的作用是将找到的文本拼接成一个字符串,并将其中的空格和“,”去掉。将文本写入到“.content.txt”文件中。
终端中显示找到的文本如下:
写入到文件夹中的文件如:
如果contet后面不加“\n”,写入到件夹得内容就只会写入一行数据。
2. 获取最外层标签,遍历内部所有的标签,“//text()”获取本标签的文本以及它所有子标签的文本。
通过“//text()”可以直接获取指定标签的父级标签,不用直接获取本标签,就可以直接找到父级标签下的所有文本,但缺点是可能获取多余的数据。
此时终端获取到的数据是没有经过处理的,如果要得到符合的文本数据,可采取上一种方式处理数据的方法,通过遍历正则得到想要的数据,这里不再重复介绍。
3.正则去掉所有标签<.*?> re.compile.sub
先找到指定的文本标签,然后通过正则,去掉文本外的标签符号,只留下文本内容,如下。
此时的到的数据也是没经过处理的,所以要想得到符合的数据文本,要采用之前数据处理的方法,数据处理的方法多种多样,只要最后获取符合要求即可。
4.string(.)获取文本直接拼接文本
content = div.xpath('.//div[@class="p_content "]').xpath('string(.)').get()
print(content)
kouge = re.compile('\s')
content = re.sub(kouge,'',content)+'\n'
print(content)
self.f.write(content)
string(.) 可以直接获取文本,不用在指定标签后面跟“/text()”或者“//text()”,得到的文本不用在通过遍历后拼接成完整的数据,它是直接获得拼接以后的文本列表,只需要将它在列表其中取出即可。之后的处理数据和以上采用的方法相同。
未完待续!!!!!