一、爬取网页源代码
1、下载网页的html源代码
from bs4 import BeautifulSoup
def handlechapter(url):
response = urllib.request.urlopen(url)
html = response.read().decode('utf-8')
return html
html = handlechapter(url) #url为某贴吧首页的链接
#这里为url = 'http://tieba.baidu.com/f?kw=%E4%B8%9C%E5%8C%97%E5%A4%A7%E5%AD%A6%E7%A7%A6%E7%9A%87%E5%B2%9B%E5%88%86%E6%A0%A1&ie=utf-8&pn=0'
注意网页的源代码为utf-8编码
2、将html文件转换为python文件
url_soup = BeautifulSoup(html, 'html.parser')
Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种: Tag , NavigableString , BeautifulSoup , Comment
【1.Tag类对象】
即html中的标签,BeautifulSoup对象(以上面代码中的url_soup为例)可以直接在后面接上某种标签的名称,得到的对象是该种标签在这段html中的第一个实例。
比如对于print(url_soup.h)
>>> <h class="...">...</h>
(bs里的html对象是可打印的,打印出来就是html原文)
每个Tag类对象都有两个属性,name和attrs。
name就是标签的名字,而attrs是个字典,里面记录了所有这个tag的属性值。比如有tag是<h1 class="space-seo space-meta" name="testname">HELLO</h1>
其name就是u'h1',而attrs是{u'class':[u'space-seo',u'space-meta'],u'name':u'testname'} //注意区别tag对象的name属性和写在attrs里面的name属性的区别,另外所有被存到变量里的html内容全部都变成了unicode对象。在print的时候可以指定encode,默认encode是utf-8。还有,所有class属性都默认都被解析成一个列表,即便只有一个class值,也会成为[u'class_value']
当然,在定位到Tag对象之后可以获取查看其属性值,另一方面,也可以对其属性值等进行修改,修改完了之后就是存在内存中的这个变量里面的,最终可以输出成文件的形式。
【2.String对象】 //selenium用的是text来指代标签内部的文本内容,而bs用的是string。而且对于<div>这种本身不带文本带后辈节点可能带文本的标签两者意义不同。selenium中的.text会带出来所有后辈节点中的文本,而bs中的这个.string返回的是None
String对象用于代表每个元素所含的文字部分,在标签后面加上.string即可调用
注意,某个Tag对象的子节点以及子节点里面的内容都不算进string,当一个元素(比如<div>这种)里面只有子节点,本身没有文字的话,得到的就是None。
【3.BeautifulSoup对象】
指代整个文档的对象。可以视为是<html>的对象。其实之前创建的BeautifulSoup对象soup,就是指代整个html文档
【4.comment对象】
用于代表某个元素内的注释
二、清洗出想要的数据
先上一段单个帖子的格式:
<li class=" j_thread_list clearfix" data-field="{"id":5935765954,"author_name":"zero2crayon","author_nickname":"\ud83c\udf6dzero\ud83c\udf7c","author_portrait":"8ffe7a65726f32637261796f6ef3a4","first_post_id":122696355566,"reply_num":6,"is_bakan":null,"vid":"","is_good":null,"is_top":null,"is_protal":null,"is_membertop":null,"is_multi_forum":null,"frs_tpoint":null}">
<div