from bs4 import BeautifulSoup
from lxml import etree
import codecs#codecs专门用作编码转换,当我们要做编码转换的时候可以借助codecs很简单的进行编码转换
#实例化BeautifulSoup对象
#数据解析
#数据存取
#将本地文档对象加载到html中
html=open('./test.html','r',encoding='utf-8')
soup=BeautifulSoup(html,'lxml')#用lxml解析器解析,实例化好的的soup对象
#print(soup)输出实例化对象soup
#print(soup.li)#返回的是html中第一次出现的tagName标签,不返回所有的标签
#print(soup.find('div'))#等同于soup.div 返回第一个div 内的全部内容
#print(soup.find('div',class_='song'))#返回指定class='song'标签,打印整个标签内容都返回#标签属性定位
#print(soup.find_all('a'))#打印所有a标签内所有内容,以列表形式返回
#print(soup.find_all('a')[0])#返回第一个a标签
#print(soup.select('.tang'))#以列表返回tang标签内的所有内容
#print(soup.find('div',class_='tang'))#返回的是字符串,等同于soup.select('.tang')
#print(soup.select('.tang>ul>li>a'))#用>表示层级关系,打印所有li线面的所有a 标签,不支持索引print(soup.select('.tang>ul>li[0]>a'))
#print(soup.select('.tang>ul>li>a')[0])#不写【0】,返回li下所有a 标签,写了返回第一个a 标签
#print(soup.select('.tang>ul a')[0])#中间加空格,可以不是直属属性,比ul 直属属性是li ,加空格 打印第一个a
# print(soup.select('.tang>ul a')[1].text)#text输出文本返回第二个a标签中的文本值
# print(soup.select('.tang>ul a')[1].get_text())
# print(soup.select('.tang>ul a')[1].string)
#print(soup.find('div',class_='song').text)#返回所找标签下所有文本
#print(soup.find('div',class_='song').string)#返回为空,只能获取标签下直系文本(就是song文本,但song 没有文本)
#print(soup.find('div',class_='song').get_text())#返回所找标签下所有文本
#print(soup.select('.tang>ul a')[0]['href'])#获取a标签下的href链接
# print(soup.select('.tang>ul a')[5]['href'])
# print(soup.find('title').text)
# print(soup.select('.tang>ul i')[0].text)
f=codecs.open("test.html","r","utf-8")#转换字符后打开
content=f.read()#读取文本
f.close()#问价关闭
html1=etree.HTML(content)
so=html1.xpath('//title/text()')[0]
so1=html1.xpath('//ul/li/i/text()')[0]
so2=html1.xpath('//ul/li/a/@href')[5]
print(so2)