BeautifulSoup简单使用
#coding=utf-8
import requests
from bs4 import BeautifulSoup
resp=requests.get('https://www.baidu.com') #请求百度首页
#resp=requests.request('get','https://www.baidu.com') #同上
print(resp) #打印请求结果的状态码
print(resp.content) #打印请求到的网页源码
#标准选择器
#将网页源码构造成BeautifulSoup对象,采用解析器lxml解析html/xml
bsobj=BeautifulSoup(resp.content,'lxml')
#bsobj=BeautifulSoup(resp.content,'lxml/lxml-xml')
print(bsobj.prettify()) #实现格式化输出,可用于标签,方法<tag>.prettify()
print(bsobj.title) #获取第一个title标签
print(bsobj.title.string) #获取第一个title标签的文本内容
print(bsobj.head.title.string) #嵌套选择,获取head标签下的title标签的文本内容
print(bsobj.p.a)
print(bsobj.p) #获取第一个p标签
print(bsobj.p.string) #获取第一个p标签的文本内容,标签内非属性字符串
print(bsobj.img.attrs) #获取第一个img标签的所有属性
print(bsobj.p.attrs['id']) #获取第一个p标签的id属性值
print(bsobj.p.a.contents) #contents返回的是子节点列表,包含空格
le=bsobj.p.children #chilren 返回的是迭代对象,子节点的迭代类型,主要用于循环遍历子节点
for i in le:
print(i)
print(bsobj.p.parent) #第一个p标签的父节点
print(bsobj.get_text()) #获取所有标签文本内容
#find_all(name,attrs,text),可以根据标签名,属性,文本内容查找文档
#find():返回匹配结果的一个元素
print(bsobj.find_all('p')[0]) #获取列表的第一个元素
for p in bsobj.find_all('p'):
print(p.find_all('a')) #获取所有p标签下的a标签
print(bsobj.find_all(attrs={'id':'cp'})) #获取id属性值是cp的对应标签及子节点
print(bsobj.find_all(text='©2017 Baidu ')) #检索字符串
print(bsobj.find_all(id='cp')) #获取id属性值是cp的对应标签及子节点
#其他方法
#<>.find() 搜索且只返回一个结果,同.find_all()参数
#<>.find_parents() 在先辈节点中搜索,返回列表类型,同.find_all()参数
#<>.find_parent() 在先辈节点中返回一个结果,同.find()参数
#<>.find_next_siblings() 在后续平行节点中搜索,返回列表类型,同find_all()参数
#<>.find_next_sibling() 在后续平行节点中搜索,返回一个结果,同find()参数
#<>.find_previous_siblings() 在前续平行节点中搜索,返回列表类型,同find_all()参数
#<>.find_previous_sibling() 在前续平行节点中搜索,返回一个结果,同find()参数
#css选择器: select()
# 1. .表示class ,#表示id
# 2.其他属性 比如:[name=Tom]
# 3.标签1,标签2 找到所有的标签1和标签2
# 4.标签1 标签2 找到标签1内部的标签2
sel=BeautifulSoup(resp.content,'html.parser') #html.parser这是python自带的解析库
print(sel.select('.mnav')) #获取属性class值是mnav的标签
print(sel.select('.mnav[name=tj_trnews]')) #获取属性class值是mnav且name值为tj_trnews的标签
print(sel.select('.mnav.xxx')) #获取属性class值是mnav的标签下的class属性值是xxx的标签
print(sel.select('p a')) #获取p标签下的所有a标签
print(sel.select('#u1 .lb')) #获取id属性为u1的标签内部的class属性值是lb的标签
for a in sel.select('p'):
print(a.get_text()) #get_text()可以获取文本内容
a_list=bsobj.find_all('a') #获取网页中的所有a标签对象
text='' # 创建一个空字符串
for a in a_list:
href=a.get('href') #获取a标签对象的href属性,即这个对象指向的链接地址
#print(href)
text+=href+'\n' #加入到字符串中,并换行
with open('baidulink.txt','w') as f: #在当前路径下,以写的方式打开一个名为'baidulink.txt',如果不存在则创建
f.write(text) #将text里的数据写入到文本中