使用 Beautiful Soup
参考资料:https://cuiqingcai.com/5548.html
# 导入Beautiful模块
from bs4 import BeautifulSoup
# 初始化
soup = BeautifulSoup(html,'lxml')
soup = BeautifulSoup(html,'lxml)
完成了初始化。如果该html不是完整的html代码(指没有html和body节点),初始化过程可以自动更正格式,将html,body部分补上。
第一个参数html是要解析的html代码。第二个参数是选取的解析器,这里最好选lxml
soup.prettify()
:可以把要解析的字符串以标准的缩进格式输出。
soup.a
:a节点开始到闭合处的所有代码
soup.a.contents
:以列表形式储存的a节点开始到闭合处的所有内容
利用例子说明
html文本
html = """
<html>
<head>
<title>The Dormouse's story</title>
</head>
<body>
<p class="story">
Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">
<span>Elsie</span>
</a>
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a>
and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>
and they lived at the bottom of a well.
</p>
<p class="story">...</p>
"""
print(soup.p)
和print(soup.p.contents)
的输出分别为:
请仔细对比观察差异。
soup.a.name
:获取a节点的名称
soup.a.attrs
:以列表形式获取a节点下的所有属性
soup.a.attrs[b]
:获取a节点下b属性对应的值
soup.a.string
:获取a节点的内容
从外到内多级选取节点
soup.a.b.c.d
:获取a节点的b节点的c节点的d节点开始到闭合处的所有代码
子节点与子孙节点
soup.a.children
:获取a的直接子节点
children属性返回的是一个 列表迭代器 对象,因此可迭代
soup.a.descendants
:获取a的子孙节点
descendants属性返回的是一个 生成器 对象,也可迭代
父节点与祖父节点
soup.a.parent
:获取a节点的父节点
soup.a.parents
:获取a节点的祖先节点
注意的是soup.a.parents
的类型是生成器,因此如果我们想看到内容,应用list()方法将其转化成列表
如print(list(soup.a.parents))
兄弟节点(同级节点)
soup.a.next_sibling
:获取a的下一个同级节点
soup.a.previous_sibling
:获取a的上一个同级节点
以上返回一个元素
soup.a.next_siblings
:获取a接下来的所有同级节点
soup.a.previous_siblings
:获取a之前的所有同级节点
以上返回生成器
方法选择器
find_all()
api如右:find_all(name , attrs , recursive , text , **kwargs)
通过节点名来查询元素
soup.find_all(name='ul')
:找到名称为ul的节点,以列表形式返回
通过属性来查询元素
soup.find_all(attrs={'id': 'list-1'})
:找到id为list-1的节点,以列表形式返回
由于属性是字典类型,所以参数传的时候也要按键值对来传
通过文本来查询元素
soup.find_all(text=re.compile('link'))
:找到文本里有link的节点,以列表形式返回
由于要用到re里的compile方法,所以此项用前要import re
find()
跟find_all()
用法一样,不过find()
返回的是第一个匹配的元素,而find_all()
是所有(因此也以列表的形式)
另外还有这些:
find_parents()
和find_parent()
:前者返回所有祖先节点,后者返回直接父节点。find_next_siblings()
和find_next_sibling()
:前者返回后面所有的兄弟节点,后者返回后面第一个兄弟节点。find_previous_siblings()
和find_previous_sibling()
:前者返回前面所有的兄弟节点,后者返回前面第一个兄弟节点。find_all_next()
和find_next()
:前者返回节点后所有符合条件的节点,后者返回第一个符合条件的节点。
)和
find_previous_sibling()`**:前者返回前面所有的兄弟节点,后者返回前面第一个兄弟节点。find_all_next()
和find_next()
:前者返回节点后所有符合条件的节点,后者返回第一个符合条件的节点。find_all_previous()
和find_previous()
:前者返回节点后所有符合条件的节点,后者返回第一个符合条件的节点。