# 簡單示例from bs4 import BeautifulSouphtml_doc ="""
<html><head><title>The Dormouse's story</title></head>
<body>
asdf<div class="title"><b>The Dormouse's story總共</b><h1>f</h1></div>
<div class="story">Once upon a time there were three little sisters; and their names were<a class="sister0" id="link1">Els<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">...</p>
</body>
</html>
"""soup = BeautifulSoup(html_doc, features="lxml")
tag1 = soup.find(name='a')# 找到第一個a標簽
tag2 = soup.find_all(name='a')# 找到所有的a標簽
tag3 = soup.select('#link2')# 找到id=link2的標簽
find(name, attrs, recursive, text, **kwargs)
# name參數,查找所有名字為name的tag,字符串對象被忽略。
soup.find_all('title')# keyword參數,如果一個指定名字的參數不是搜索內置的參數名,搜索時會把該參數當作指定名字tag的屬性來搜索。
soup.find_all(id='link2')# 如果多個指定名字的參數可以同時過濾tag的多個屬性:
soup.find_all(href=re.compile('elsie'),id='link1')# 有些tag屬性在搜索不能使用,比如HTML5中的data*屬性,但是可以通過find_all()的attrs參數定義一個字典來搜索:
data_soup.find_all(attrs={'data-foo':'value'})# recursive參數
如果指向搜索tag的直接子節點,可以使用參數recursive=False。# limit參數
可以用來限制返回結果的數量# text 參數
通過 text 參數可以搜搜文檔中的字符串內容,與 name 參數的可選值一樣, text 參數接受 字符串 , 正則表達式 , 列表
body = soup.find('body')
body.decompose()print(soup)
extract,遞歸的刪除所有的標簽,并獲取刪除的標簽
body = soup.find('body')
v = body.extract()print(soup)
decode,轉換為字符串(含當前標簽);decode_contents(不含當前標簽)
body = soup.find('body')
v = body.decode()
v = body.decode_contents()print(v)
encode,轉換為字節(含當前標簽);encode_contents(不含當前標簽)
body = soup.find('body')
v = body.encode()
v = body.encode_contents()print(v)
find,獲取匹配的第一個標簽
tag = soup.find('a')print(tag)
tag = soup.find(name='a', attrs={'class':'sister'}, recursive=True, text='Lacie')
tag = soup.find(name='a', class_='sister', recursive=True, text='Lacie')print(tag)
find_all,獲取匹配的所有標簽
tags = soup.find_all('a')print(tags)
tags = soup.find_all('a',limit=1)print(tags)
tags = soup.find_all(name='a', attrs={'class':'sister'}, recursive=True, text='Lacie')# tags = soup.find(name='a', class_='sister', recursive=True, text='Lacie')print(tags)# ####### 列表 ######## v = soup.find_all(name=['a','div'])# print(v)# v = soup.find_all(class_=['sister0', 'sister'])# print(v)# v = soup.find_all(text=['Tillie'])# print(v, type(v[0]))# v = soup.find_all(id=['link1','link2'])# print(v)# v = soup.find_all(href=['link1','link2'])# print(v)# ####### 正則 #######import re
# rep = re.compile('p')# rep = re.compile('^p')# v = soup.find_all(name=rep)# print(v)# rep = re.compile('sister.*')# v = soup.find_all(class_=rep)# print(v)# rep = re.compile('http://www.oldboy.com/static/.*')# v = soup.find_all(href=rep)# print(v)# ####### 方法篩選 ######## def func(tag):# return tag.has_attr('class') and tag.has_attr('id')# v = soup.find_all(name=func)# print(v)# ####### get,獲取標簽屬性# tag = soup.find('a')# v = tag.get('id')# print(v)
has_attr,檢查標簽是否具有該屬性
tag = soup.find('a')
v = tag.has_attr('id')print(v)
get_text,獲取標簽內部文本內容
tag = soup.find('a')
v = tag.get_text('id')print(v)
index,檢查標簽在某標簽中的索引位置
tag = soup.find('body')
v = tag.index(tag.find('div'))print(v)tag = soup.find('body')for i,v inenumerate(tag):print(i,v)