Python3爬蟲學習筆記(4.BeautifulSoup庫詳解)
阿新 • • 發佈:2019-01-16
這是一個功能強大的庫,可以代替很多需要寫正則的地方
這是一個第三方解析庫,常規安裝方法:
調出cmd:pip install bs4
簡單瞭解:
html = """ <html lang="en"><head> <meta charset="UTF-8"> <title>TITLE</title> </head> <body> <table border="1"> <tr>/ <td>第一行,第1列</td> <td>第一行,第2列</td><td>第一行,第3列</td> </tr> </table> </body> </html>""" from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') #自動補全修正html文字 print(soup.prettify()) #獲得html的標題 print(soup.title.string)
標籤選擇器:
html = """ <html lang="en"><head> <meta charset="UTF-8"><title>TITLE</title> </head> <body> <table border="1"> <tr>/ <td>第一行,第1列</td> <td>第一行,第2列</td> <td>第一行,第3列</td> </tr> </table> </body> </html>""" from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') print(soup.title) #<title>TITLE</title> print(soup.head) ''' <head> <meta charset="utf-8"/> <title>TITLE</title> </head> ''' print(soup.td) #只能獲取第一個,所以列印:<td>第一行,第1列</td>
獲取屬性:
html = """ <html lang="en"><head> <meta charset="UTF-8"> <title>666</title> </head> <body> <table border="1"> <tr>/ <td>第一行,第1列</td> <td>第一行,第2列</td> <td>第一行,第3列</td> </tr> </table> </body> </html>""" from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') print(soup.table["border"]) #1
獲取內容:
html = """ <html lang="en"><head> <meta charset="UTF-8"> <title>666</title> </head> <body> <table border="1"> <tr> <td>第一行,第1列</td> <td>第一行,第2列</td> <td>第一行,第3列</td> </tr> </table> </body> </html>""" from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') print(soup.table.tr.td.string) #第一行,第1列
子節點:
html = """ <html lang="en"><head> <meta charset="UTF-8"> <title>666</title> </head> <body> <table border="1"> <tr> <td>第一行,第1列</td> <td>第一行,第2列</td> <td>第一行,第3列</td> </tr> </table> </body> </html>""" from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') print(soup.table.tr.contents) #['\n', <td>第一行,第1列</td>, '\n', <td>第一行,第2列</td>, '\n', <td>第一行,第3列</td>, '\n']另外一種:
html = """ <html lang="en"><head> <meta charset="UTF-8"> <title>666</title> </head> <body> <table border="1"> <tr> <td>第一行,第1列</td> <td>第一行,第2列</td> <td>第一行,第3列</td> </tr> </table> </body> </html>""" from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') for i, child in enumerate(soup.table.tr.children): print(i, child) ''' 0 1 <td>第一行,第1列</td> 2 3 <td>第一行,第2列</td> 4 5 <td>第一行,第3列</td> 6 可以看出.children實際上是一個迭代器。 '''
子孫節點:
html = """ <html lang="en"><head> <meta charset="UTF-8"> <title>666</title> </head> <body> <table border="1"> <tr> <td>第一行,第1列</td> <td>第一行,第2列</td> <td>第一行,第3列</td> </tr> </table> </body> </html>""" from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') for i, child in enumerate(soup.table.descendants): print(i, child) ''' 0 1 <tr> <td>第一行,第1列</td> <td>第一行,第2列</td> <td>第一行,第3列</td> </tr> 2 3 <td>第一行,第1列</td> 4 第一行,第1列 5 6 <td>第一行,第2列</td> 7 第一行,第2列 8 9 <td>第一行,第3列</td> 10 第一行,第3列 11 12 '''
父節點:
html = """ <html lang="en"><head> <meta charset="UTF-8"> <title>666</title> </head> <body> <table border="1"> <tr> <td>第一行,第1列</td> <td>第一行,第2列</td> <td>第一行,第3列</td> </tr> </table> </body> </html>""" from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') print(soup.tr.parent) ''' <table border="1"> <tr> <td>第一行,第1列</td> <td>第一行,第2列</td> <td>第一行,第3列</td> </tr> </table> '''
兄弟節點:
html = """ <html lang="en"><head> <meta charset="UTF-8"> <title>666</title> </head> <body> <table border="1"> <tr> <td>第一行,第1列</td> <td>第一行,第2列</td> <td>第一行,第3列</td> </tr> </table> </body> </html>""" from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') print(list(enumerate(soup.td.next_siblings))) #[(0, '\n'), (1, <td>第一行,第2列</td>), (2, '\n'), (3, <td>第一行,第3列</td>), (4, '\n')] print(list(enumerate(soup.td.previous_siblings))) #[(0, '\n')]
標準選擇器(實用):
find_all詳解:
html = """ <html lang="en"><head> <meta charset="UTF-8"> <title>666</title> </head> <body> <table border="1"> <tr> <td id="1">第一行,第1列</td> <td class="c1">第一行,第2列</td> <td>第一行,第3列</td> </tr> </table> </body> </html>""" from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') print(soup.find_all("td")) #[<td>第一行,第1列</td>, <td>第一行,第2列</td>, <td>第一行,第3列</td>] #可以遍歷輸出,這裡不寫了(td標籤裡面的內容是後邊臨時加的) print(soup.find_all(attrs={"id": "1"})) #[<td id="1">第一行,第1列</td>](臨時加的id) print(soup.find_all(id="1")) #[<td id="1">第一行,第1列</td>] print(soup.find_all(class_="c1")) #[<td class="c1">第一行,第2列</td>](臨時加的class) #注意這裡要加上下劃線 print(soup.find_all(text="第一行,第3列")) #['第一行,第3列']
find方法類似,只不過是把find_all方法獲取的列表裡面的第一個元素拿出來了,這裡就不仔細寫了。
CSS選擇器:
html = """ <html lang="en"><head> <meta charset="UTF-8"> <title>666</title> </head> <body> <table class="c0" border="1"> <tr id="0"> <td id="1">第一行,第1列</td> <td id="2" class="c1">第一行,第2列</td> <td id="3">第一行,第3列</td> </tr> </table> </body> </html>""" from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') print(soup.select("tr td")) #[<td id="1">第一行,第1列</td>, <td class="c1">第一行,第2列</td>, <td>第一行,第3列</td>] print(soup.select(".c0 .c1")) #[<td class="c1">第一行,第2列</td>] print(soup.select("#0 .c1")) #[<td class="c1">第一行,第2列</td>] for td in soup.select("td"): print(td["id"]) #臨時加入的三個id,會遍歷輸出1,2,3 for td in soup.select("td"): print(td.get_text()) """ 第一行,第1列 第一行,第2列 第一行,第3列 """