下面研究如何讓<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