BeautifulSoup的基本使用

#BeautfiulSoup是Python支持的一個第三方庫,它的主要做用是能夠很是方便的從HTML網頁中提取所須要的數據
#lxml是第三方的解析庫,默認狀況下BS4會使用Python自帶的解析器取解析html頁面,可是lxml解析速度更快,功能上更爲強大,由於它的底層是經過c語言實現的。
from bs4 import BeautifulSoup
import re
#建立一個BeautifulSoup對象
bs=BeautifulSoup(open("index.html",encoding="utf-8"),"lxml")
#BeautifulSoup()類,它是將一個HTML文檔,轉換成一個複雜的,有層次的樹形結構,從而造成父節點和子節點之間的關係,每個節點對應一個Python對象。

#樹形結構中的Python對象類型:
#BeautifulSoup:通常指代的是整個html文檔內容
#Tag:指代的就是html文檔中的一個標籤,有兩個重要的樹形,name,attrs
#NavigableString:指代的是就是標籤中的文字
#Comment:這個對象是一個特殊的NavigableString對象,其輸出的內容是註釋可是不包含註釋符號

# print(bs)
# print(type(bs))#BeautifulSoup

#------------------------------選擇元素-----------------------------------
# #獲取html文檔中title標籤的內容
# print(bs.title)
# print(type(bs.title))#Tag
#
# #獲取html文檔中a標籤的內容(會匹配第一個符合要求的a標籤)
# print(bs.a)
# print(type(bs.a))#Tag
# #獲取html文檔中的div標籤的內容
# print(bs.div)
# print(type(bs.div))#Tag
# #獲取html文檔中div下面的a標籤的內容
# print(bs.div.a)

#-------------------提取信息(標籤名稱,屬性值,文本)-----------------------------
#獲取標籤的名稱,name屬性是在獲取當前標籤的名稱
# print(bs.head.name)
# print(bs.title.name)
# #獲取某一個標籤內部的屬性值attrs
# print(bs.a.attrs)
# #只獲取某個標籤的其中一個屬性值
# print(bs.a["href"])
# print(bs.a.get("id"))
# #獲取標籤的文本內容,string:獲取某個標籤的文本內容的時候,若是這個標籤裏面沒有標籤了,則.stirng獲取的就是該標籤的文本內容,若是該標籤內容中還抱歉其餘標籤則返回None
# print(bs.title.string)
# print(type(bs.title.string))#NavigableString
# print(bs.div.string)
# print(bs.p.string)
# print(type(bs.p.string))#Comment


#------------------------文檔樹節點的選擇--------------------------------------------------
#1>contents屬性:遍歷某一個父節點的直接子節點,能夠將Tag類型的直接子節點以列表的方式進行輸出,可是直接子節點內部的子節點是沒法單獨獲取的。
# print(bs.body.contents)
# #直接從子節點列表中獲取某一個節點
# print(bs.body.contents[1])
# #2.>children屬性,返回的是一個生成器對象,能夠將Tag類型的直接子節點以生成器的方式進行輸出,可是直接子節點的內部的子節點沒法單獨獲取到。
# print(bs.body.children)
# for i,child in enumerate(bs.body.children):
#     print(i,child)

#3.>descendants屬性:獲取全部的子孫節點(即包含直接子節點,又包含子節點的子節點),結果也是一個生成器對象
# print(bs.body.descendants)
# for i,child in enumerate(bs.body.descendants):
#     print(i,child)
#4.>parent屬性:獲取父節點以及父節點包含的全部內容
# print(bs.title.parent)

#5.>next_sibling屬性:獲取當前節點的下一個兄弟節點,若是沒有下一個兄弟節點,則返回None
#實際文檔中的tag的.next_sibiling和.previous_sibling屬性一般是字符串或者空白,由於空白或者換行也能夠被視做爲一個節點,因此獲得的結果多是空白或者換行
# print("===",bs.meta.next_sibling)
# print("===",bs.meta.next_sibling.next_sibling)
#
# #6.>previous_sibling屬性,獲取當前節點的上一個兄弟節點,若是沒有則返回None
# print("----",bs.title.previous_sibling)
# print("----",bs.title.previous_sibling.previous_sibling)


#-----------------經過find_all 和find進行文檔樹內容的搜索------------------------------------
#1>find_all()用於搜索當前節點的全部子節點,返回值是一個列表
#name,attrs recursive, text,limit
result_list=bs.find_all('a')
print(result_list)

result_list_1=bs.find_all(attrs={"class":"second"})
print(result_list_1)
result_list_3=bs.find_all(attrs={"id":"one"})
print(result_list_3)

#使用find_all()方法時,BeautifulSoup會檢索當前標籤的全部子孫節點,若是隻想搜索標籤的直接子節點,能夠將recursive設置爲False,limit能夠對查找到的節點個數進行限制
result_list_4=bs.body.find_all(recursive=False,limit=2)
print(result_list_4)

result_list_5=bs.find_all(text="騰訊")
print(result_list_5)

result_list_6=bs.find_all(id="one")
print(result_list_6)

#因爲class是Python的系統關鍵字,表示類。因此使用find_all來經過class屬性值來匹配內容的時候,須要將class變爲class_
result_list_7=bs.find_all(class_="second")
print(result_list_7)

result_list_8=bs.find_all(id=re.compile("two"))
print(result_list_8)

#find()和findall用法一致,只不過finall返回的是一個列表,find返回的是第一個符合條件的內容。
'''
(3)find_parents()  find_parent()

find_all() 和 find() 只搜索當前節點的全部子節點,孫子節點等. find_parents() 和 find_parent() 用來搜索當前節點的父輩節點,搜索方法與普通tag的搜索方法相同,搜索文檔搜索文檔包含的內容
(4)find_next_siblings()  find_next_sibling()

這2個方法經過 .next_siblings 屬性對當 tag 的全部後面解析的兄弟 tag 節點進行迭代, find_next_siblings() 方法返回全部符合條件的後面的兄弟節點,find_next_sibling() 只返回符合條件的後面的第一個tag節點
(5)find_previous_siblings()  find_previous_sibling()

這2個方法經過 .previous_siblings 屬性對當前 tag 的前面解析的兄弟 tag 節點進行迭代, find_previous_siblings() 方法返回全部符合條件的前面的兄弟節點, find_previous_sibling() 方法返回第一個符合條件的前面的兄弟節點
(6)find_all_next()  find_next()

這2個方法經過 .next_elements 屬性對當前 tag 的以後的 tag 和字符串進行迭代, find_all_next() 方法返回全部符合條件的節點, find_next() 方法返回第一個符合條件的節點
(7)find_all_previous() 和 find_previous()

這2個方法經過 .previous_elements 屬性對當前節點前面的 tag 和字符串進行迭代, find_all_previous() 方法返回全部符合條件的節點, find_previous()方法返回第一個符合條件的節點
'''

#-----------------經過css選擇器進行文檔樹內容的搜索------------------------------------
#1.經過標籤名來搜索一個標籤
print(bs.select("title"))
print(bs.select("a"))
#2.經過class屬性值搜索一個標籤
#.是用來匹配一個屬性值得固定用法
print(bs.select(".second"))
#3.經過id這個屬性值來搜索一個標籤
#   #號是匹配id值得固定用法
print(bs.select("#two"))

#4.組合查找

print(bs.select("div #two"))
print(bs.select("div .second"))
相關文章
相關標籤/搜索