1. 程式人生 > 實用技巧 >Python-django建立第一個專案

Python-django建立第一個專案

技術標籤:列表pythonjavaxpath正則表示式

一、介紹

Beautiful Soup 是一個可以從HTML或XML檔案中提取資料的Python庫.它能夠通過你喜歡的轉換器實現慣用的文件導航,查詢,修改文件的方式.Beautiful Soup會幫你節省數小時甚至數天的工作時間.目前已經開發到4.0以上了

baautifulsoup常用的解析器如下:

解析器使用方法優勢劣勢
Python標準庫BeautifulSoup(markup,"html.parser")
  • Python的內建標準庫
  • 執行速度適中
  • 文件容錯能力強
  • Python 2.7.3 or 3.2.2)前 的版本中文件容錯能力差
lxml HTML 解析器BeautifulSoup(markup,"lxml")
  • 速度快
  • 文件容錯能力強
  • 需要安裝C語言庫
lxml XML 解析器

BeautifulSoup(markup,["lxml","xml"])

BeautifulSoup(markup,"xml")

  • 速度快
  • 唯一支援XML的解析器
  • 需要安裝C語言庫
html5libBeautifulSoup(markup,"html5lib")
  • 最好的容錯性
  • 以瀏覽器的方式解析文件
  • 生成HTML5格式的文件
  • 速度慢
  • 不依賴外部擴充套件

二、BeautifulSoup的使用

1、遍歷文件樹

遍歷文件樹:即直接通過標籤名字選擇,特點是選擇速度快,但如果存在多個相同的標籤則只返回第一個

# 1、用法:
from bs4 import BeautifulSoup
soup=BeautifulSoup(html_doc,'lxml')
head=soup.head
# print(head)

# 2、獲取標籤的名字: 重點
p = soup.p
print(p.name) #>: p

# 3、獲取標籤的屬性  重點
p = soup.body.p # 獲取body下的p標籤
print(p.attrs) # 結果:{'id': 'my_p', 'class': ['title']}
# 獲取p標籤內屬性值的三種方法
p.attrs.get('class')
p.get('class')
p['class']

# 4、獲取標籤的內容  重點
'''
text: 取所選標籤內下所有的文字內容
string: 若所選標籤下的文字只有一個時,取到,否則為None
strings: 拿到一個生成器物件,取下所選標籤下的所有文字內容
stripped_strings: 是去掉空白
get_text():是用來調取內部屬性text的方法。
區別:string獲取的是該標籤的直系內容,無法獲取該標籤子標籤的直系內容,
     而text/get_text()可以
注意:如果選標籤下包含多個節點,則string輸出結果是None,比如:body下有多個p節點
'''
p=soup.body.p
print(p.text)
print(p.string)
print(p.strings)  #結果:<generator object _all_strings at 0x0000026619237BF8>
for line in p.stripped_strings:
    print(line)
print(p.get_text())

# 5、巢狀選擇    重點
s = soup.body.a
print(s.get('id'))

# 6、子節點、子孫節點
print(soup.p.contents) #取出p下的所有子節點
print(soup.p.children) #取出包含p標籤下所有子節點,返回一個迭代器
print(list(soup.p.children))

# 7、父節點、祖先節點
print(soup.a.parent) #獲取a標籤的父節點(只有一個)
print(soup.p.parent) #獲取p標籤的父節點
print(soup.a.parents) #返回生成器,找到a標籤所有的祖先節點,父親的父親,父親的父親的父親...
print(list(soup.a.parents))#找到a標籤所有的祖先節點,父親的父親,父親的父親的父親...

# 8、兄弟節點
print(soup.a.next_sibling) #下一個兄弟
print(soup.a.previous_sibling) #上一個兄弟

print(list(soup.a.next_siblings)) #下面的兄弟們=>生成器物件
print(list(soup.a.previous_siblings)) #上面的兄弟們=>生成器物件

2、搜尋文件樹

(1)find()和find_all()

'''
 find_all(name , attrs , recursive , text , **kwargs)
 用處:找到所有符合要求的標籤
 引數:name是標籤名,attrs是一個字典引數,用來搜尋包含特殊屬性的標籤,比如:data-*型別的屬性
 recursive:True,則會搜尋當前標籤的子孫節點,如果是False,則只搜尋當前標籤的子節點。
 text: 可以是字元,列表,True,正則
 注意:按類名查詢的時候,關鍵字是class_
'''
soup.find_all('a') #
soup.find(['a','p']) #找到所有a和p標籤
soup.find_all('a',limit=2) #找到前兩個a標籤
soup.find_all('a',attrs={'data-fooo':'value'})
soup.find_all('p',attrs={'class':'title'})
soup.find_all('p',recursive=False)
soup.find_all('a',text='Lacie')
soup.find_all(text='Lacie')
soup.find_all(class_='title')
'''
 find_(name , attrs , recursive , text , **kwargs)
 用處:找到第一個符合要求的標籤
 引數:name是標籤名,attrs是一個字典引數,用來搜尋包含特殊屬性的標籤,比如:data-*型別的屬性
 recursive:True,則會搜尋當前標籤的子孫節點,如果是False,則只搜尋當前標籤的子節點。
 text: 可以是字元,列表,True,正則
 注意:按類名查詢的時候,關鍵字是class_
'''
print(soup.find('a')) #尋找a標籤
print(soup.find('a',id='link3'))  #尋找id是link3的a標籤
print(soup.find('a',class_='sister2'))
print(soup.find('a',title='xxx')) #尋找title是xxx的a標籤

'''
區別:find_all() 方法的返回結果是值包含一個元素的列表,而 find() 方法直接返回結果.
     find_all() 方法沒有找到目標是返回空列表, find() 方法找不到目標時,返回 None 
'''

(2)五種過濾器

'''
五種過濾器:字串、正則表示式、列表、True、方法
'''
# 1、字串:也就是標籤名
soup.find_all('b')
# 2、正則表示式
import re
soup.find_all(re.compile('^b')) #找b開頭的標籤
# 3、列表
soup.find_all(['a','p'])
# 4、True: 匹配任何值
soup.find_all(True)  #查詢所有標籤,但是不會返回字串節點
# 5、方法:可以是自己定義的方法
def myfunc(tag):
    return tag.has_attr('class') and not tag.has_attr('id')
soup.find_all(myfunc())

(3)css選擇器

'''
css選擇器:返回的是列表
'''
# 1、獲取標籤
print(soup.select('.element'))
print(soup.select('#link3'))
# 2、獲取標籤的屬性
soup.select('#link3')[0].attrs
# 3、獲取標籤的內容
soup.select('#link3')[0].get_text()

三國演義小說爬取案例:

# -*-coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup
import lxml
headers={
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
}
req=requests.get('http://www.shicimingju.com/book/sanguoyanyi.html',headers=headers)
soup=BeautifulSoup(req.text,'lxml')
li_list=soup.select('.book-mulu > ul > li > a')

for li in li_list:
    url='http://www.shicimingju.com'+li['href']
    title = li.string
    req_detail=requests.get(url,headers=headers)
    soup_detail=BeautifulSoup(req_detail.text,'lxml')
    detail_text=soup_detail.find('div',class_='chapter_content').text
    file_name=title+'.txt'
    with open(file_name,'w',encoding='utf-8') as f:
        f.write(detail_text)
        print(title+'   載入完畢')

爬肯德基餐廳資訊(ajax請求,是post請求,返回的是資料)

# -*-coding:utf-8 -*-
import requests
import json
url='http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
headers={
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
}
# word=input(">>:")
data={
    'cname': '',
    'pid': '',
    'keyword': '普寧',
    'pageIndex': 1,
    'pageSize': 10,
      }
res=requests.post(url,data=data,headers=headers)
print(res.json())