from import BeautifulSoup
html = '~~~~~~~~~~~~~'
soup = BeautifulSoup(html, 'lxml')
print(soup.title.string)
简单情况 生成soup对象,用该对象选择节点,然后提取属性值或者文本值,这就是这篇博客的目的了
获取直接子节点:
print(soup.p.contents)
获得子孙节点: 返回为生成器类型
for i, child in enumerate(soup.p.descendants):
print(i,child)
获得父节点:
print(soup.p.parent)# 获得的是p 的直接父节点
print(soup.p.parents) #获得的是祖先系列的所有父节点
获取兄弟节点:
print(soup.p.next_sibling)#后面的一个兄弟
print(soup.p.previous_sibling)#前面的一个兄弟
print(list(enumerate(soup.p.next_siblings)))#后面的所有兄弟
print(list(enumerate(soup.p.previous_siblings)))#前面的所有兄弟
单节点:
如何取文本:
print(soup.p.string)#只会选择第一个找到的p节点,然后输出其本文
如何取属性值:
print(soup.p['class'])#只会找到第一个p节点,输出器 class属性的值
多节点:
#取文本
print(list(soup.p.parents)[0])#从里至外 算顺序
#取属性
print(list(soup.p.parents)[0].attrs['class'])
print(list(soup.p.parents)[0]['class'])
补:还可以用find_all(name, attrs, text )方法来找对应的节点(可以找到多个)
name: 利用节点名
print(soup.find_all(name='ul')) #通过节点名名来找节点
for ul in soup.find_all(name='ul'):
print(ul.find_all(name='li')) #这种通过节点名字来找节点的方法还可以嵌套
attrs:利用属性
print(soup.find_all(attrs={ 'id':'list' })) # 属性名与值的键值对 用 字典来表示
print(soup.find_all(id='list')) #这是简便的写法
#当然了,由于class是python关键字,所以这里特殊为 class_
print(soup.find_all(class_='color'))
text: 利用文本值, text 可以为文本 或 正则表达式
print(soup.find_all(text='hello'))
print(soup.find_all(text= re.compile('link')))
补:find(name, attrs, text) 方法和find_all()一样使用,不过,其只能返回第一个匹配的节点
一样的使用方式,但是查询的范围不同:(参数条件都是一样的使用)
find_parents():返回所有满足条件的祖先节点
find_parent():返回满足条件直接父节点
find_next_siblings() 、find_next_sibling() :返回后面的满足条件所有兄弟节点、 返回后面的满足条件第一个兄弟节点
find_previous_siblings()、find_previous_sibling():返回前面的满足条件所有兄弟节点、 返回前面的满足条件第一个兄弟节点
补:用css选择器找相应的节点: 只要使用select()方法就好了
print(soup.select('ul li')) # 找ul标签下的所有li节点
print(soup.select('#list .element')) #找id选择器list 下的 其中类选择器为element的节点
#当然了,也可以嵌套的
for ul in soup.select('ul'):
print(ul.select('li')) #找到所有ul下的 所有li节点
ok,真正结束了
88