python解析本地HTML⽂件
  Python使⽤爬⾍技术时,每运⾏⼀次,本地都会访问⼀次主机。为避免完成程序前调试时多次访问主机增加主机负荷,我们可以在编写程序前将⽹页源代码存在本地,调试时访问本地⽂件即可。现在我来分享⼀下爬取资料的调试过程。
⼀、将⽹页源代码存在本地
  1、打开需要爬取的⽹页,⿏标右键查看源代码
  2、复制源代码,将代码保存⾄本地项⽬⽂件⽬录下,⽂件后缀改为.html
⼆、在Python中打开本地html⽂件
  打开并读取本地⽂件可使⽤BeautifulSoup⽅法直接打开
soup=BeautifulSoup(open('ss.html',encoding='utf-8'),features='html.parser')  #features值可为lxml
  解析后可以直接使⽤soup,与请求⽹页解析后的使⽤⽅法⼀致
三、使⽤本地⽂件爬取资料
  1、先爬取主页的列表资料,其中同义内容使⽤“@”符号连接
def draw_base_list(doc):
lilist=soup.find('div',{'class':'babynames-term-articles'}).findAll('article');
#爬取⼀级参数
for x in lilist:
str1=''
count=0
a='@'
EnName=x.find('a').text;
Mean=x.find('div',{'class':'meaning'}).text;
Sou=x.find('div',{'class','related'}).findAll('a')
Link=x.find('a').get('href');
for x in Sou:
if count!=0:#添加计数器判断是否为第⼀个,不是则添加@
str1=str1+a
s=str(x)  #将x转换为str类型来添加内容
str1=str1+s
count+=1
Source=str1
print(Source);
     print(Meaning);
  运⾏后发现Source和Meaning中包含了标签中的内容,我们使⽤正则表达式re.sub()⽅法删除str中指定内容。查看源代码可以发现标签内容只有⼀个链接,可以获取标签内的链接后再指定删除。
  ⾸先在for循环内给定⼀个值获取标签内的链接('href'),接着使⽤sub⽅法指定删除link。代码如下:
('href')
change2=re.sub(link,'',s)
  运⾏后我们发现str中还存在标签名,在for循环中指定多余内容删除:
('href')
s=str(x)
change1=re.sub('<a href="','',s)
change2=re.sub(link,'',change1)
change3=re.sub('">','',change2)
change4=re.sub(' Baby Names','',change3)
change5=re.sub('</a>','',change4)
change=re.sub('','',change5)
  最后就能得到想要的信息。
  2、再爬取详细信息
  通过def draw_base_list(doc)函数向⼆级详情函数传递Link参数爬取详细信息,为避免频繁访问主机,我们同样将详情页的源代码保存⾄本地并解析。
def draw_detail_list():
str1=‘’
meta="boy"
doc=BeautifulSoup(open('nn.html',encoding='utf-8'),features='html.parser')
Des=doc.find('div',{'class':'single-babyname-wrapper'}).findAll('p')
Gen=doc.find('div',{'class':'entry-meta'}).find('a')
#print(Gen)
g=str(Gen)
for i in Gen:
if meta in g:
Gender="boy"
else:
Gender="girl"
#print(Gender)
for x in Des:
#print(x)
if x.find('a')==None:  #该标签下有我们不需要的信息,查看源代码到信息之间的联系,发现不需要的信息中都有链接
c=str(x)
change1=re.sub('<p>','',c)  #与⼀级信息函数⼀样删除指定内容
change2=re.sub('</p>','',change1)
change3=re.sub('\t','',change2)
change=re.sub('\n','@',change3)
str1=str1+change
#
#print(Description)
Description=str1
#print(Description)
data={  #将数据存进字典中⽅便将数据保存⾄csv⽂件或数据库中
'EnName':EnName,
'CnName':'',
'Gender':Gender,
'Meaning':Meaning,
'Description':Description,
'Source':Source,
'Character':'',  #⽹页中没有的信息数据列为空
'Celebrity':'',
'WishTag':''
}
#print(data)
  3、将爬取下来的数据存⼊csv⽂件中
def draw_base_list(doc):
......
#爬取⼀级参数
for x in lilist:
......
for x in Sou:
......
......
draw_detail_list(Link,EnName,Meaning,Source)  #将数据传给⼆级信息函数
def draw_detail_list(url,EnName,Meaning,Source):
......
for i in Gen:
......
for x in Des:
......
data={
......python正则表达式爬虫
}
write_dictionary_to_csv(data,'Names')  #将字典传给存放数据函数,并给定csv⽂件名
def write_dictionary_to_csv(dict,filename):
file_name='{}.csv'.format(filename)
with open(file_name, 'a',encoding='utf-8') as f:
file_exists = os.path.isfile(filename)
w =csv.DictWriter(f, dict.keys(),delimiter=',', quotechar='"', lineterminator='\n',quoting=csv.QUOTE_ALL, skipinitialspace=True)
w.writerow(dict)
  打开⽂件后发现没有⽂件头,为避免重复写⼊⽂件头,判断⽂件是否为空,若为空则写⼊⽂件头:
#防⽌每次循环重复写⼊列头
if size(file_name)==0 :  #通过⽂件⼤⼩判断⽂件是否为空,为0说明是空⽂件
w.writeheader()
  再次运⾏后⽂件头正常写⼊⽂件中。
  4、访问主机,完成信息爬取
  确定代码正确没有错误后就可以将打开本地⽂件的代码改成访问⽹页,最后完成数据的爬取。