1 html = """ 2 <html><head><title>The Dormouse's story</title></head> 3 <body> 4 <p class="title" name="dromouse"><b>The Dormouse's story</b></p> 5 <p class="story">Once upon a time there were three little sisters; and their names were 6 <a href="http://example.com/elsie" class="sister" id="link1"><!-- Elsie --></a>, 7 <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and 8 <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>; 9 and they lived at the bottom of a well.</p> 10 <p class="story">...</p> 11 """ 12 from bs4 import BeautifulSoup 13 14 #1、標籤選擇器 15 soup = BeautifulSoup(html,'lxml') 16 print(soup.prettify())#自動進行格式化處理,補全標籤等 17 print(soup.title.string)#獲得title標籤裏的內容,獲取x裏面的內容用soup.x.string 18 print(soup.title)#獲取title標籤 19 print(soup.title.name)#得到標籤的名稱,注意是標籤 20 print(soup.head)#獲取head標籤 21 print(soup.p)#匹配第一個p標籤 22 print(soup.p['name'])#獲取p標籤的屬性即後面的name部分<p class="title" name="dromouse"> 23 print(soup.head.title.string)#能夠進行嵌套層層剝離標籤 24 print(soup.p.contents)#獲取p標籤的全部子節點,以列表形式返回 25 print(soup.p.children)#返回迭代器,能夠以循環方式遍歷p標籤的子節點 26 for i,child in enumerate(soup.p.children): 27 print(i,child) 28 print(soup.p.descendants)#返回迭代器,獲取全部的子孫節點 29 print(soup.a.parent)#獲取a標籤的父節點信息 30 print(soup.a.parents)#獲取祖先節點 31 print(soup.a.next_siblings)#返回迭代器,下一個兄弟節點 32 print(soup.a.previous_siblings)#返回迭代器,前一個兄弟節點 33 34 #2、標準選擇器 35 36 html=''' 37 <div class="panel"> 38 <div class="panel-heading"> 39 <h4>Hello</h4> 40 </div> 41 <div class="panel-body"> 42 <ul class="list" id="list-1" name="elements"> 43 <li class="element">Foo</li> 44 <li class="element">Bar</li> 45 <li class="element">Jay</li> 46 </ul> 47 <ul class="list list-small" id="list-2"> 48 <li class="element">Foo</li> 49 <li class="element">Bar</li> 50 </ul> 51 </div> 52 </div> 53 ''' 54 #find_all 55 from bs4 import BeautifulSoup 56 soup = BeautifulSoup(html,'lxml') 57 58 print(soup.find_all('ul'))#查找ul標籤全部內容 59 60 print(soup.find_all(attrs={'id':'list-1'}))#能夠將attrs傳入字典以完成查找 61 print(soup.find_all(id='list-1'))#能夠簡寫,不用傳入attrs 62 print(soup.find_all(class_='element'))#能夠簡寫 63 print(soup.find_all(text='Foo'))#能夠匹配到foo 64 65 ''' 66 #find與find_all用法一致,只是返回第一個元素 67 find_parents() find_parent() 68 find_parents()返回全部祖先節點,find_parent()返回直接父節點。 69 find_next_siblings() find_next_sibling() 70 find_next_siblings()返回後面全部兄弟節點,find_next_sibling()返回後面第一個兄弟節點。 71 find_previous_siblings() find_previous_sibling() 72 find_previous_siblings()返回前面全部兄弟節點,find_previous_sibling()返回前面第一個兄弟節點。 73 find_all_next() find_next() 74 find_all_next()返回節點後全部符合條件的節點, find_next()返回第一個符合條件的節點 75 find_all_previous() 和 find_previous() 76 find_all_previous()返回節點後全部符合條件的節點, find_previous()返回第一個符合條件的節點 77 78 ''' 79 print('*'*200) 80 #css選擇器 81 print(soup.select('.panel .panel-heading'))#用.代替class 82 print(soup.select('ul li'))#找到ul li的全部標籤 83 print(soup.select('#list-2 .element'))#用#代替id 84 for ul in soup.select('ul'):#獲取ul標籤 85 print(ul['id'])#獲取ul標籤的id屬性 86 for ul in soup.select('ul'): 87 print(ul.get_text())#獲取ul的文本內容 88 89 90 91 #總結: 92 # 推薦使用lxml解析庫,必要時使用html.parser 93 #標籤選擇器篩選功能弱可是速度極快 94 #建議使用find(),findall()查詢匹配單個結果或者多個結果 95 #若是對css選擇器熟悉建議使用select() 96 #記住經常使用的獲取屬性和文本的方法