BeautifulSoup4基本使用

BeautifulSoup

BeautifulSoup是一个模块,该模块用于接收一个HTML或XML字符串,然后将其进行格式化,之后遍可以使用他提供的方法进行快速查找指定元素,从而使得在HTML或XML中查找指定元素变得简单。从而代替自己写复杂的正则表达式

安装

pip3 install beautifulsoup4

标签选择器

from bs4 import BeautifulSoup

# 测试用html
html = 
"""
<html><head><title>保险柜</title></head>
<body>
asdf
<div class="story">Once upon a time there were three little sisters; and their names were
    <a  class="sister" id="link1">aEls<span>f</span>ie</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.</div>
ad<br/>sf
<p class="story">aa<a>...</a>a</p>
</body>
<b class="story">fuck you</b>

<ul class="u1" id="i1">
    <li>one</li>
    <li>two</li>
    <li>three</li>
</ul>
</html>
"""

soup = BeautifulSoup(html, features="lxml")
print(soup.prettify())  # 自动补齐html中缺失的标签
print(soup.title.string) 


# A: 标签选择器
print(soup.title)    #
print(type(soup.title))  # <class 'bs4.element.Tag'>
print(soup.head)
print(soup.a)   # 输出第一个匹配标签

# 获取名称
print(soup.title.name)  # title

# 获取属性
print(soup.a["id"])        # link1
print(soup.a.attrs["id"])  # link1

# 获取内容
print(soup.p.string)

# 嵌套选择
print(soup.p)
print(soup.body.p)

# 父节点和祖先节点
print(soup.li)
print( soup.li.parent)     # 获取父节点,返回列表
print(list(soup.li.parents)) # 获取祖先节点,返回生成器

# 子节点和子孙节点
# 获取子节点
print(soup.div.contents)   # 解析所有子节点成列表
print(soup.div.children)   # 迭代器类型,内容和上面相同
# 获取子孙节点
print(soup.div.descendants) # 获取子孙节点,生成器

# 兄弟节点
print(list(soup.li.next_siblings)) # 获取节点后面所有标签
print(list(soup.li.previous_siblings))

find_all()和find()选择器

# B: findall() 和 find() 选择器

# 通过属性名进行查找
print(soup.find_all(attrs={"class", "story"})) # [tag,tag,tag]
print(soup.find_all(class_="story"))  # class是python内置函数

# 根据文本内容进行选择text
# 常用于内容匹配
print(soup.find_all(text="fuck you")) # ['fuck you']

# find
# find()和find_all()用法相同,find()返回匹配到的第一个元素。

css选择器

# C: css选择器
print(soup.select(".story"))  # 返回列表
print(soup.select("#link1"))
print(soup.select("ul li")[1])
print(soup.select("#link1"))

# css选择器: tag["class"]获取属性
print(soup.select("ul")[0]["class"]) # 返回列表

# css选择器: get_text()获取内容
print(soup.select("ul li")[0].get_text()) # 返回列表

总结

  • 推荐使用lxml解析库, 再次使用htmlparser
  • 建议使用find()和find_all()查询单个和多个结果
  • 熟悉CSS选择器,建议使用select()
原文地址:https://www.cnblogs.com/zouruncheng/p/7435417.html