soup.title
soup.title.name
soup.title.string
soup.title.parent.name//上层标签
soup.p
soup.p[‘class’]
soup.a
soup.find_all(‘a’)//得到所有完整a标签
for link in soup.find_all(‘a’):
print(link.get(‘href”))//得到a标签内部的href
soup.get_text()//得到文档中所有文字的内容
1.Python标准库 BeautifulSoup(markup,”html.parser”)
2.lxml HTML解析器 BeautifulSoup(markup,”lxml”)
3.lxml XML 解析器 BeautifulSoup(markup,”xml”)
BeautifulSoup(markup,[“lxml-xml”])
4.html5lib BeautifulSoup(markup,”html5lib”)
推荐使用lxml作为解析器,因为效率更高
Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种: Tag , NavigableString , BeautifulSoup , Comment .
Tag
tag的属性操作方法与字典一样
1.name属性:
tag.name
2.attributes属性:
tag.attrs//输出字典
tag[‘class’]
3.多值属性
在Beautiful Soup中多值属性的返回类型是list
NavigableString
Beautiful Soup用 NavigableString 类来包装tag中的字符串
通过 unicode() 方法可以直接将 NavigableString 对象转换成Unicode字符串:
type(tag.string)//navigablestring类型
unicode_string = unicode(tag.string)
tag中包含的字符串不能编辑,但是可以被替换成其它的字符串,用 replace_with() 方法:
如果想在Beautiful Soup之外使用 NavigableString 对象,需要调用 unicode() 方法,将该对象转换成普通的Unicode字符串,否则就算Beautiful Soup已方法已经执行结束,该对象的输出也会带有对象的引用地址.这样会浪费内存.
BeautifulSoup
对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象
Comment
表示文档的注释部分是一个特殊类型的 NavigableString 对象:
注意: Beautiful Soup中字符串节点不支持这些属性,因为字符串没有子节点
通过点取属性的方式只能获得当前名字的第一个tag
tag的 .contents 属性可以将tag的子节点以列表的方式输出:
支持.contents[0]形式
字符串没有 .contents 属性,因为字符串没有子节点:
通过tag的 .children 生成器,可以对tag的子节点进行循环:
for child in title_tag.children:
print(child)
.contents 和 .children 属性仅包含tag的直接子节点.
.descendants 属性可以对所有tag的子孙节点进行递归循环
如果tag只有一个 NavigableString 类型子节点,那么这个tag可以使用 .string 得到子节点
如果一个tag仅有一个子节点,那么这个tag也可以使用 .string 方法,输出结果与当前唯一子节点的 .string 结果相同:如果tag包含了多个子节点,tag就无法确定 .string 方法应该调用哪个子节点的内容, .string 的输出结果是 None :
如果tag中包含多个字符串 ,可以使用 .strings 来循环获取:
通过 .parent 属性来获取某个元素的父节点.
通过元素的 .parents 属性可以递归得到元素的所有父辈节点
使用 .next_sibling 和 .previous_sibling 属性来查询兄弟节点:
find() 和 find_all()
soup.find_all('b')//查找所有B标签
for tag in soup.find_all(re.compile("t"))://所有名字当中带t字母的标签
print(tag.name)
for tag in soup.find_all(re.compile("^b"))://所有名字以b开头的标签
print(tag.name)
soup.find_all(["a", "b"])//分别查找所有的a b 标签,运用了字符串那一类
soup.find_all("a", class_="sister")
soup.find_all("p", class_="body strikeout")
find_all("p", "title") 返回的是CSS Class为”title”的标签
通过 string 参数可以搜搜文档中的字符串内容.与 name 参数的可选值一样, string 参数接受 字符串 , 正则表达式 , 列表, True .
soup.find_all(string="Elsie")
soup.find_all(string=["Tillie", "Elsie", "Lacie"])
soup.find_all(string=re.compile("Dormouse"))
调用tag的 find_all() 方法时,Beautiful Soup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 recursive=False .
soup.html.find_all("title", recursive=False)
soup.find_all('title', limit=1) 等价于 soup.find('title')
limit 参数限制返回结果的数量只找邻近的一个
.select() 方法
在 Tag 或 BeautifulSoup 对象的 .select() 方法中传入字符串参数, 即可使用CSS选择器的语法找到tag通过tag标签逐层查找:
soup.select("body a")
soup.select("html head title")
直接子标签
soup.select("p > a")
兄弟节点标签:
soup.select("#link1 ~ .sister")
通过tag的id查找
soup.select("#link1")
通过CSS的类名查找
soup.select(".sister")
soup.select("[class~=sister]")
soup.get_text("|")//分隔符
任何HTML或XML文档都有自己的编码方式,比如ASCII 或UTF-8,但是使用Beautiful Soup解析后,文档都被转换成了Unicode:
通过传入 from_encoding 参数来指定编码方式:
soup = BeautifulSoup(markup, from_encoding="iso-8859-8")
. (exclude_encodings 参数是4.4.0版本的新功能)排除,这样文档就不会尝试使用这种编码了解码
两个 NavigableString 或 Tag 对象具有相同的HTML或XML结构时, Beautiful Soup就判断这两个对象相同.
如果想判断两个对象是否严格的指向同一个对象可以通过 is 来判断
copy.copy() 方法可以复制任意 Tag 或 NavigableString 对象
import copy
p_copy = copy.copy(soup.p)
如果仅仅因为想要查找文档中的标签而将整片文档进行解析,实在是浪费内存和时间.最快的方法是从一开始就把标签以外的东西都忽略掉. SoupStrainer 类可以定义文档的某段内容,这样搜索文档时就不必先解析整篇文档,只会解析在 SoupStrainer 中定义过的文档. 创建一个 SoupStrainer 对象并作为 parse_only 参数给 BeautifulSoup 的构造方法即可.
from bs4 import SoupStrainer
1.only_a_tags = SoupStrainer("a")
2.only_tags_with_id_link2 = SoupStrainer(id="link2")
3.def is_short_string(string):
return len(string) < 10
only_short_strings = SoupStrainer(string=is_short_string)
print(BeautifulSoup(html_doc, "html.parser", parse_only=only_a_tags).prettify())
#参数一为解析的内容,参数二为指定解析器
print(BeautifulSoup(html_doc, "html.parser", parse_only=only_tags_with_id_link2).prettify())
print(BeautifulSoup(html_doc, "html.parser", parse_only=only_short_strings).prettify())
默认情况下,Beautiful Soup会将当前文档作为HTML格式解析,如果要解析XML文档,要在 BeautifulSoup 构造方法中加入第二个参数“xml”:
soup = BeautifulSoup(markup, "xml")
当然,还需要 安装lxml
还有提高Beautiful Soup效率的办法,使用lxml作为解析器.Beautiful Soup用lxml做解析器比用html5lib或Python内置解析器速度快很多.
加油吧,程序员!