Step 1 : 獲取HTML文件的內容
# encoding: UTF-8
# 爬蟲獲取:南方電網招標採購信息
import requests
# 定義主入口網址
main_url = "http://www.bidding.csg.cn/zbcg/index.jhtml"
# 請求網址
r = requests.get(main_url)
# 打印:返回結果的類型,狀態碼,編碼方式,Cookies
print(type(r))
print(r.status_code)
print(r.encoding)
print(r.cookies)
# 打印返回的內容
print(r.text)
Step 2 : 創建BeautifulSoup對象
from bs4 import BeautifulSoup
requests
1. 基本Get
支持get, put, delete, head, options
r = request.get('http://www.baidu.com')
加參數的Get(Params)
url = 'http://.......'
payload = {'key1':'value1', 'key2':'value2'}
r = request.get(url, params=payload)
BeautifulSoup
四大對象種類
Beautiful Soup將複雜HTML文檔轉換成一個複雜的樹形結構,每個節點都是Python對象,所有對象可以歸納爲4種:
- Tag
- NavigableString
- BeautifulSoup
- Comment
1. Tag
- Tag通常來說就是HTMl中的一個標籤。可以用來查找一個標籤的內容,比如此處獲取 title 標籤:
print soup.title
- 對於Tag,有兩個重要的屬性
- name
print soup.title.name
- 輸出對象的名稱
- attrs
print soup.a.attrs
- 輸出對象的屬性,類型是一個字典
- 獲取單獨某個屬性
print soup.a[href]
`print soup.a.get('href')
2. NavigableString
獲取標籤內部的文字
print soup.a.string
3. BeautifulSoup對象
BeautifulSoup 對象表示的是一個文檔的全部內容.大部分時候,可以把它當作 Tag 對象,是一個特殊的 Tag,我們可以分別獲取它的類型,名稱,以及屬性
4. Comment
Comment 對象是一個特殊類型的 NavigableString 對象,其實輸出的內容仍然不包括註釋符號,但是如果不好好處理它,可能會對我們的文本處理造成意想不到的麻煩。
遍歷文檔樹
1. 直接子節點
- .contents
- tag 的 .content 屬性可以將tag的子節點以列表的方式輸出
print soup.head.contents
print soup.head.contents[0]
- .children
print soup.head.children
for child in soup.body.children:print child
2. 所有子孫節點
- .descendants
for child in soup.descendants:print child
3. 節點內容
如果一個標籤裏面沒有標籤了,那麼 .string 就會返回標籤裏面的內容。如果標籤裏面只有唯一的一個標籤了,那麼 .string 也會返回最裏面的內容
4.多個內容
1. .strings
獲取多個內容,不過需要遍歷
2. .stripped_strings
輸出的字符串中可能包含了很多空格或空行,使用 .stripped_strings 可以去除多餘空白內容
父節點(加s表示全部)
Tag的父節點:Tag.parent
- .parent
兄弟節點(加s表示全部)
Tag的兄弟節點:Tag.next-sibling
- .next_sibling
- .previous_sibling
搜索文檔樹
find_all(name, attrs, recursive, text, **kwargs)
搜索當前tag的所有tag子節點,並判斷是否符合過濾器的條件
name
- 可以查找所有名字爲name的tag,字符串對象會被忽略
- A. 傳字符串
print soup.find_all('a')
- 查找文檔中所有的標籤
- B. 傳正則表達式
soup.find_all(re.compile("^b"))
- 查找文檔中以b開頭的標籤
- C. 傳列表
soup.find_all(['a','b')
- 查找文檔中全部a和b標籤
- D. 傳True
- 查找全部Tag,但是不會返回字符串節點
- E. 傳方法
- 還可以定義一個方法,方法只接受一個元素參數 [4] ,如果這個方法返回 True 表示當前元素匹配並且被找到,如果不是則反回 False
KeyWord
- 如果傳入 href 參數,Beautiful Soup會搜索每個tag的”href”屬性
soup.find_all(href=re.compile("elsie"))
- 使用多個指定名字的參數可以同時過濾tag的多個屬性
soup.find_all(href=re.compile("elsie"), id='link1')
- 如果傳入 href 參數,Beautiful Soup會搜索每個tag的”href”屬性
- text
- 搜索字符串內容
- 同樣可以像name的可選參數一樣