# 导入
from bs4 import BeautifulSoup
# 本地文件生成对象
soup = BeautifulSoup(open('test.html', 'r', encoding='utf-8'), 'lxml')
# 根据标签名查找节点
# 找到第一个符合条件的节点返回
print(soup.a) # <a href="" id="xlwb">新浪微博</a>
# 获取标签的属性和属性值
print(soup.a.attrs) # {'href': '', 'id': 'xlwb'}
# soup.find():返回单个对象
# 根据 title 值来找到对应的标签对象
print(soup.find('li', title="dzm")) # <li id="l4" title="dzm">武汉</li>
# 根据 class 值来找到对应的标签对象
# print(soup.find('li', class="c1")) # 关键字 class 存在 python 中会报错无法使用
print(soup.find('li', class_="c1")) # 可以通过加下划线来使用属于系统关键字的属性 <li class="c1" id="l1">北京</li>
# soup.find_all():返回数组
# 查找所有 a 标签
print(soup.find_all('a')) # [<a href="" id="xlwb">新浪微博</a>, <a href="" id="bdyx">百度一下</a>]
# 查找所有 a | span 标签
print(soup.find_all(['a', 'span'])) # [<a href="" id="xlwb">新浪微博</a>, <span>哈哈哈</span>, <a href="" id="bdyx">百度一下</a>]
# limit 限制查找数量,查找前几个数据
print(soup.find_all('li', limit=2)) # [<li class="c1" id="l1">北京</li>, <li class="c2" id="l2">上海</li>]
#【推荐使用】soup.select():返回数组,制成选择器写法
# 查找所有 a 标签
print(soup.select('a')) # [<a href="" id="xlwb">新浪微博</a>, <a href="" id="bdyx">百度一下</a>]
# 查找所有 a | span 标签
print(soup.select('a,span')) # [<a href="" id="xlwb">新浪微博</a>, <span>哈哈哈</span>, <a href="" id="bdyx">百度一下</a>]
# 【类选择器】
# 查找 class 属性为 c2 的标签
print(soup.select('.c2')) # [<li class="c2" id="l2">上海</li>]
# 查找 id 属性为 l3 的标签
print(soup.select('#l3')) # [<li id="l3">深圳</li>]
# 【属性选择器】
# 查找 li 标签中有 id 的标签
print(soup.select('li[id]')) # [<li class="c1" id="l1">北京</li>, <li class="c2" id="l2">上海</li>, <li id="l3">深圳</li>, <li id="l4" title="dzm">武汉</li>]
print(soup.select('li[id="l2"]')) # [<li class="c2" id="l2">上海</li>]
print(soup.select('li[class="c5 c6"]')) # [<li class="c5 c6">沈阳</li>]
# 【后代选择器】
# 找到 div 下的 li
print(soup.select('div li')) # [<li class="c1" id="l1">北京</li>, <li class="c2" id="l2">上海</li>, <li id="l3">深圳</li>, <li id="l4" title="dzm">武汉</li>]
# 【子代选择器】
# print(soup.select('div>ul>li')) # 这种格式的,空格写不写都行
print(soup.select('div > ul > li')) # [<li class="c1" id="l1">北京</li>, <li class="c2" id="l2">上海</li>, <li id="l3">深圳</li>, <li id="l4" title="dzm">武汉</li>]
# 【推荐使用】节点属性
# 获取节点内容(注意:标签对象中只有内容,那么下面两个都行,如果标签对象中还包含其他标签,那么 string 就获取不到了)
# 推荐使用 get_text()
print(soup.select('span')[0].string) # 哈哈哈
print(soup.select('span')[0].get_text()) # 哈哈哈
# 获得节点
obj = soup.select('#xlwb')[0] # <a href="" id="xlwb">新浪微博</a>
# 标签名称
print(obj.name) # a
# 标签属性json
print(obj.attrs) # {'href': '', 'id': 'xlwb'}
# 获取属性值
print(obj.attrs['id']) # xlwb
print(obj.attrs.get('id')) # xlwb
print(obj.get('id')) # xlwb
print(obj['id']) # xlwb