Beautifulsoup - doranbai/Note GitHub Wiki

Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象
所有对象可以归纳为种Tag , NavigableString , BeautifulSoup , Comment

<html attr='attr value'>
<title attr='a'>内容</title>
</html>
标签包括标签名,属性和标签体,对应beautiful中的TAG,使用标签名就可以提取标签,
soup.标签名,例如soup.title就直接返回<title attr='a'>内容</title>,soup.title会按顺序查找,返回第一个找到的标签
标签名soup.title.name
标签属性值soup.title.attrs['属性名'],或者soup.title.attrs.get('属性名')
标签内容soup.title.string,如果含有子标签用soup.title.get_text().这些内容为'bs4.element.NavigableString'类型的对象。

进阶

tag内容列表化 TAG.contents和TAG.children
<td>File:<a href="/uploads/flash.7z">flash.7z</a></td>
td.contents输出为['File:', <a href="/uploads/flash.7z">flash.7z</a>],类型分别为NavigableString和TAG
Tag对象的.children方法得到一个其子节点的迭代器,可以遍历之获取其中的元素。

TAG搜索
搜索当前Tag对象的所有子节点
 find_all(name, attrs, recursive, string, limit, **kwargs)

beautifulsoup的css选择器
我们在写 CSS 时,标签名不加任何修饰,类名前加点,id名前加 #,在这里我们也可以利用类似的方法来筛选元素,用到的方法是 soup.select(),返回类型是 list
(1)通过标签名查找
print(soup.select("title"))  #[<title>The Dormouse's story</title>]
print(soup.select("b"))      #[<b>The Dormouse's story</b>]
(2)通过类名查找
print(soup.select(".sister")) 

[<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, 
<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, 
<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

(3)通过 id 名查找
print(soup.select("#link1"))
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]
(4)组合查找
组合查找即和写 class 文件时,标签名与类名、id名进行的组合原理是一样的,例如查找 p 标签中,id 等于 link1的内容,二者需要用空格分开
print(soup.select("p #link2"))

#[<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
直接子标签查找

print(soup.select("p > #link2"))
# [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
(5)属性查找
查找时还可以加入属性元素,属性需要用中括号括起来,注意属性和标签属于同一节点,所以中间不能加空格,否则会无法匹配到。

print(soup.select("a[href='http://example.com/tillie']"))
#[<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
select 方法返回的结果都是列表形式,可以遍历形式输出,然后用 get_text() 方法来获取它的内容:

for title in soup.select('a'):
    print (title.get_text())

'''
Elsie
Lacie
Tillie
'''

⚠️ **GitHub.com Fallback** ⚠️