此博文是对之前博文的补充 :https://blog.csdn.net/Clany888/article/details/81986302
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml') # 不标准的HTML字符串BeautifulSoup可以自动更正格式
soup.prettify() # 将要解析的字符串按照标准缩进格式输出,结果中含有bady和html节点
1、节点选择器
直接调用节点的名称就可以选择节点元素,再调用string属性就可以得到节点内的文本啦。
提取信息:
节点属性:
获取名称:
可以使用soup.title.name 利用name获取节点的名称
获取属性:
意有的返回的结果是字符串(单个),有的返回的结果是列表(多个的时候)。
获取内容:
可以利用string属性获取节点元素包含的文本内容。例如想要获取一个p节点的文本内容
soup.p.string
嵌套选择:
上面每一个返回的结果都是bs4.element.Tag类型,它同样可以继续调用节点进行下一步 的选择。
soup.head.title
soup.head.title.string
关联选择:
在做选择的时候有时候不能做到一步就选到想要的节点元素,需要想选中某一个节点元素,然后以它为基准再选择它的的子节点、父节点、兄弟节点等
子节点和子孙节点
soup.p.children
for i,child in enumerate(soup.p.children):
print(i,child)
调用children属性来选择,返回结果是生成器类型。利用for输出相应的内容。
返回结果也是生成器,遍历输出一下可以看到,这次输出的结果就包含了span节点。descendants会递归查询所有子节点,得到所有的子孙节点。
父节点和祖先节点
兄弟节点(兄弟节点即同级的节点)
提取信息
2、方法选择器
name:可以根据节点名来查询元素
attrs:传入属性来查询;soup.find_all(attrs={'id':'list_id'})
text:参数用来匹配节点的文本,传入的形式可以是字符串,也可以是正则表达式对象。soup.find_all(text=re.compile('link'))
find返回的是单个元素,也就是第一个匹配的元素,而findall返回的是所有匹配的元素组成的列表。
find_parents()和find_parent():前者返回所有祖先节点,后者返回直接父节点
find_next_sublings()和find_next_sibling():前者返回后面所有的兄弟节点,后者返回后面第一个兄弟节点。
find_previous_siblings()和find_previous_sibling():前者返回前面所有的兄弟节点,后者返回前面第一个兄弟节点。
find_all_next()和find_next(): 前者返回节点后所有符合条件的节点,后者返回第一个符合条件的节点。
find_all_previous()和find_previous():
3、CSS选择器
使用CSS选择器时,只需要调用select()方法,传入相应的CSS选择器即可。
soup.select('.panel .panel-heading')
soup.select('ul li') # 选择所有ul节点下面的所有li节点,结果便是所有的li节点组成的列表。
soup.select(('ul')[0] # 仍然是Tag类型
select()方法同样支持嵌套选择。例如先选择所有ul节点,再遍历每个ul节点,选择其li节点。
因为节点的类型是Tag类型,所以获取属性还可以用原来的方法。
for ul in soup.select('ul'):
print(ul['id'])
print(ul.attrs['id'])
可以看到,直接传入中括号和属性名,以及通过attrs属性获取属性值,都OK。
获取文本同样可以使用string。 此外,还可以使用 get_text()
for li in soup.select('li'):
print('String:', li.string)
print('Get Text:', li.get_text())
---END---