Python 3 Anaconda 下爬蟲學習與爬蟲實踐 (2)

 

下面研究如何讓<html>內容更加「友好」的顯示html

以前略微接觸的prettify能爲顯示增長換行符,提升可閱讀性,用法以下:python

import requests
from bs4 import BeautifulSoup

r=requests.get("https://www.baidu.com/")
r.encoding=r.apparent_encoding
demo=r.text
soup=BeautifulSoup(demo,"html.parser")
print(soup.prettify())

一樣,它也能夠爲其中的個別標籤作專門的處理,好比對a標籤進行處理正則表達式

代碼以下:express

import requests
from bs4 import BeautifulSoup

r=requests.get("https://www.baidu.com/")
r.encoding=r.apparent_encoding
demo=r.text
soup=BeautifulSoup(demo,"html.parser")
print(soup.a.prettify())

 

 其輸出結果以下:app

<a class="mnav" href="http://news.baidu.com" name="tj_trnews">
 新聞
</a>函數

能夠發現a標籤被清晰的打印了出來學習

關於bs4庫的總結code

 下面進行信息標記的學習htm

信息標記的三種形式:blog

XML,YAML,JSON(JavaScript Object Notation)

XML是使用尖括號(最先通用標記語言,較爲繁瑣)

JSON(經常使用於接口處理,但其沒法註釋)

是有類型的鍵值對 key:value

好比 "name":"北京郵電大學"

"name"是鍵(key)  「北京郵電大學」是值(value)

當值有多個的時候使用[,]組織,例如

"name":["北京郵電大學","清華大學"]

鍵值對之間能夠嵌套使用,好比:

"name" : {

  "newName":"北京理工大學",

  "oldName":"延安天然科學院"

}

YAML(用於各種系統的配置文件,有註釋易讀)

無類型鍵值對(用縮進表達所屬關係)

 

下面學習信息提取的通常方法

實例:

提取HTML中全部URL連接

思路:

1.搜索到全部<a>標籤

2.解析<a>標籤格式,提取href後的連接內容

下面是代碼部分:

from bs4 import BeautifulSoup
import requests

r=requests.get("https://www.baidu.com/")
r.encoding=r.apparent_encoding
demo=r.text
soup=BeautifulSoup(demo,"html.parser")
for link in soup.find_all('a'):
    print(link.get('href'))

效果爲:

http://news.baidu.com
https://www.hao123.com
http://map.baidu.com
http://v.baidu.com
http://tieba.baidu.com

等等

成功爬取到全部連接。

這其中很是重要的查找函數爲:

<>.find_all(name,attrs,recursive,string,**kwargs)

返回一個列表類型,存儲查找的結果

name:對標籤名稱的檢索字符串

attrs:對標籤屬性值的檢索字符串,可標註屬性檢索

recursice:是否對子孫所有檢索,默認True。

string: <>...</>中字符串區域的檢索字符串

好比

print(soup.find_all(string=re.compile('Li')))

這裏若是是soup.find_all('a')就能夠找到全部a標籤

soup.find_all(['a','b'])就能夠找到全部的a標籤和b標籤

下面想找到b開頭的全部式子,這時須要使用正則表達式,也就是re庫,後面會詳細學習,先用一下,代碼以下:

from bs4 import BeautifulSoup
import requests
import re

r=requests.get("https://www.baidu.com/")
r.encoding=r.apparent_encoding
demo=r.text
soup=BeautifulSoup(demo,"html.parser")
for tag in soup.find_all(re.compile('b')):
    print(tag.name)

下面是查找

soup.find_all('p','course')查找p標籤下類名爲course的

suop.find_all(id='link1')查找id爲link1的

因爲find_all很是常見,因此

<tag>(...)等價於<tag>.find_all(...)

soup(...)等價於soup.find_all(...)

 

 

正則表達式:

regular expression   RE

好比 'PY'開頭,後續存在很少於10個字符,後續字符不能是'P'或者'Y'

正則表達式:PY[^PY]{0,10}

.   表示單個字符

[]   字符集,[abc]表示a,b,c

相關文章
相關標籤/搜索