一、 搞清楚數(shù)據(jù)的編碼
python3中統(tǒng)一使用Unicode編碼,用4字節(jié)表示一個(gè)字符,而網(wǎng)絡(luò)中的數(shù)據(jù)包用utf-8編碼,所以需要進(jìn)行編碼轉(zhuǎn)化
編碼轉(zhuǎn)化
二、 urllib 模塊:處理http請(qǐng)求的模塊
專門處理http套接字,可以像處理文件一樣處理網(wǎng)頁
from urllib import urlopen #ps:關(guān)于import和from xxx import xxx
url='xxx'
fhand = urlopen(url).read() #返回句柄
三、beautifulsoup:用這碗美味的湯來解析網(wǎng)頁
from bs4 import BeautifulSoup
soup = BeautifulSoup(fhand,'html.parser')
四大對(duì)象種類
其中soup是html轉(zhuǎn)化后的樹形文檔,其每個(gè)節(jié)點(diǎn)都是python對(duì)象,所有對(duì)象可以歸納為4種: Tag , NavigableString , BeautifulSoup , Comment
1. Tag
和html原生文檔中標(biāo)簽相同
- name屬性獲取Tag名稱
- 獲取某個(gè)標(biāo)簽中內(nèi)容:soup.xxx
soup.a
- 獲取某個(gè)標(biāo)簽中某個(gè)屬性: soup.xxx['yyy'] (使用字典)
soup.p['class']
- 獲取子節(jié)點(diǎn)
way1:使用tag的name屬性多次調(diào)用
tag = soup.article.div.ul.li
way2:使用.contents屬性返回該tag下子節(jié)點(diǎn)列表
tag.contents
way3:使用.children生成器遍歷所有子節(jié)點(diǎn) - 獲取父節(jié)點(diǎn)
way1: 使用.parent獲取父節(jié)點(diǎn)
way2: 使用.parents 屬性遍歷所有的父輩節(jié)點(diǎn)
tag = soup.article
for p in tag.parents:
print p.name
- 獲取兄弟節(jié)點(diǎn)
使用.next_sibling .previous_sibling 屬性
2. NavigableString
獲得標(biāo)簽內(nèi)的可遍歷字符串
soup.p.string
3. BeautifulSoup
BeautifulSoup 對(duì)象表示的是一個(gè)文檔的全部內(nèi)容.大部分時(shí)候,可以把它當(dāng)作 Tag 對(duì)象,是一個(gè)特殊的 Tag
4. Comment
處理html種注釋
文檔樹搜索
- find(name , attrs , recursive , string , ** kwargs)
只返回第一個(gè)滿足條件的元素 - find_all(name , attrs , recursive , string , ** kwargs)
指定name搜索:find_all('a')
指定屬性搜索:find_all(class='xxx')
CSS選擇器
soup.select('標(biāo)簽名')
常用:
find尋找第一個(gè)滿足條件的情況
find_all返回一個(gè)列表
find('xxx',attrs='xxx')如:find('div', class_='result')找到class為result的第一個(gè)div