摘要:大奉打更人賣報小郎君這個人仙太過正經言歸正傳從紅月開始黑山老鬼穩住別浪跳舞二解析數據是一個可以從或文件中提取數據的庫。
目錄
序號 | 表達式 | 描述 |
1 | nodename | 選取此節點的所有子節點 |
2 | / | 從根節點選擇 |
3 | // | 從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置 |
4 | . | 選取當前節點 |
5 | .. | 選取當前節點的父節點 |
6 | /text() | 選取當前路徑下的文本內容 |
7 | /@xxx | 提取當前路徑下標簽的屬性值 |
8 | |可選符 | 可選擇若干個路徑//p|//div,在當前路徑下選取所有符合條件的p標簽和div標簽 |
序號 | 表達式 | 描述 |
1 | xpath("./body/div[1]") | 選取body下的第一個div節點 |
2 | xpath("./body/div[ last() ]") | 選取body下最后一個div節點 |
3 | xpath("./body/div[ last()-1 ]") | 選取body下倒數第二個div節點 |
4 | xpath("./body/div[ position()<3 ]") | 選取body下前兩個div節點 |
5 | xpath("./body/div[ @class ]") | 選取body下帶有class屬性的div節點 |
6 | xpath("./body/div[ @class="main" ]") | 選取body下class屬性為main的div節點 |
7 | xpath("./body/div[ price>35.00 ]") | 選取body下price元素大于35的div節點 |
import requestsfrom lxml import etreeurl="https://www.qidian.com/rank/yuepiao"headers={"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"}# 發送請求resp=requests.get(url,headers)e=etree.HTML(resp.text) # 類型轉換,把str類型轉換成class "lxml.etree._Element"# print(type(e)) # names=e.xpath("http://div[@class="book-mid-info"]/h4/a/text()") # 獲取小說名稱authors=e.xpath("http://p[@class="author"]/a[1]/text()") # 獲取小說作者# print(names) # ["大奉打更人", "這個人仙太過正經", "從紅月開始", "穩住別浪", 。。。]# print(authors) # ["賣報小郎君", "言歸正傳", "黑山老鬼", "跳舞", "我最白", 。。。]for name,author in zip(names,authors): print(name, ":", author)# 大奉打更人 : 賣報小郎君# 這個人仙太過正經 : 言歸正傳# 從紅月開始 : 黑山老鬼# 穩住別浪 : 跳舞# ... ...
序號 | 解析器 | 使用方法 | 優點 | 缺點 |
1 | 標準庫 | BeautifulSoup(html,"html.parser") | 內置標準庫,速度適中,文檔容錯能力強 | Python3.2版本前的文檔容錯能力差 |
2 | lxml HTML | BeautifulSoup(html, "lxml") | 速度快,文檔容錯能力強 | 安裝C語言庫 |
3 | lxml XML | BeautifulSoup(html, "xml") | 速度快,唯一支持XML | 安裝C語言庫 |
4 | html5lib | BeautifulSoup(html, "html5lib") | 容錯能力最強,可生成HTML5 | 運行慢,擴展差 |
from bs4 import BeautifulSouphtml=""" 今天又是美好的一天 早起對自己說:我真美!
百度 """# bs=BeautifulSoup(html, "html.parser")bs=BeautifulSoup(html, "lxml")print(bs.title) # 獲取標題 今天又是美好的一天 print(bs.h1.attrs) # 獲取h1標簽的所有屬性 {"class": ["info", "bg"], "float": "left"}# 獲取單個屬性print(bs.h1.get("class")) # ["info", "bg"]print(bs.h1["class"]) # ["info", "bg"]print(bs.a["href"]) # http://www.baidu.com# 獲取文本內容print(bs.title.text) # 今天又是美好的一天print(bs.title.string) # 今天又是美好的一天# 獲取內容print("-----", bs.h2.string) # ----- 注釋的內容print("-----", bs.h2.text) # -----# string可以獲取注釋的內容,但是text不能獲取注釋內容
返回值類型 | 方法 | 功能 | 語法 | 舉例 |
Tag | find() | 提取滿足要求的首個數據 | bs.find(標簽,屬性) | bs.find("div", class_="books") |
Tag | find_all() | 提取滿足要求的所有數據 | bs.find_all(標簽,屬性) | bs.find_all("div", class_="books") |
功能 | 舉例 |
通過ID查找 | bs.select("#abc") |
通過classa查找 | bs.select(".abc") |
通過屬性查找 | bs.select(a[" class="abc" "]) |
功能 | 舉例 |
獲取標簽 | bs.title |
獲取所有屬性 | bs.title.attrs |
獲取單個屬性的值 | bs.div.get("class") bs.div["class"] bs.a["href"] |
from bs4 import BeautifulSouphtml=""" 今天又是美好的一天 今天又是美好的一天 好好學習,天天向上 百度 人生苦短,唯有愛情"""bs=BeautifulSoup(html, "lxml")print(bs.title, type(bs.title)) # 獲取標題及其類型# 今天又是美好的一天 print(bs.find("div",class_="info"), type(bs.find("div",class_="info"))) # 獲取第一個滿足條件的標簽# 今天又是美好的一天 print(bs.find_all("div", class_="info")) # 得到的是一個標簽的列表# [今天又是美好的一天, # 好好學習,天天向上# 百度# ]for item in bs.find_all("div",class_="info"): print(item, type(item))print(bs.find_all("div", attrs={"float":"right"})) # 得到屬性為"float":"right"的div標簽print("---------------CSS選擇器---------------------")print(bs.select("#gb"))print(bs.select(".info"))print(bs.select("div>span")) # [好好學習,天天向上]print(bs.select("div.info>span")) # [好好學習,天天向上]for item in bs.select("div.info>span"): print(item.text) # 好好學習,天天向上
import requestsfrom bs4 import BeautifulSoupurl="https://www.taobao.com/"headers={"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"}resp=requests.get(url,headers)# print(resp.text) # ... ...bs=BeautifulSoup(resp.text,"lxml")a_list=bs.find_all("a")# print(len(a_list)) # 128for a in a_list: url=a.get("href") # print(url) if url==None: continue if url.startswith("http") or url.startswith("https"): print(url)
序號 | 元字符 | 說明 |
1 | . | 匹配任意字符(不包括/n) |
2 | ^ | 匹配字符串的開頭 |
3 | $ | 匹配字符的末尾 |
4 | * | 匹配前一個元字符0到多次 |
5 | + | 匹配前一個元字符1到多次 |
6 | ? | 匹配前一個元字符0到1次 |
7 | {m} | 匹配前一個字符m次 |
8 | {m,n} | 匹配前一個字符m到n次 |
9 | {m,n}? | 匹配前一個字符m到n次,并且取盡可能少的情況 |
10 | // | 對特殊字符進行轉義 |
11 | [] | 一個字符的集合,可匹配其中任意一個字符 |
12 | | | 邏輯表達式“或”,比如 a|b 代表可匹配a或者b |
13 | (...) | 被括起來的表達式作為一個元組。findall()在有組的情況下只顯示組的內容 |
序號 | 元字符 | 說明 |
1 | /A | 只在字符串開頭進行匹配 |
2 | /b | 匹配位于開頭或者結尾的空字符串 |
3 | /B | 匹配不位于開頭或者結尾的空字符串 |
4 | /d | 匹配任意十進制數,相當于[0-9] |
5 | /D | 匹配任意非數字字符,相當于[^0-9] |
6 | /s | 匹配任意空白字符,相當于[/t/n/r/f/v] |
7 | /S | 匹配任意非空白字符,相當于[^/t/n/r/f/v] |
8 | /w | 匹配任意數字、字母、下劃線,相當于[a-zA-Z0-9_] |
9 | /W | 匹配任意非數字、字母、下劃線,相當于[^a-zA-Z0-9_] |
10 | /Z | 只在字符串結尾進行匹配 |
11 | [/u4e00-/u9fa5] | 中文 |
序號 | 正則處理函數 | 說明 |
1 | re.match(pattern, string, flags=0) | 嘗試從字符串的開始位置匹配一個模式,如果匹配成功,就返回一個匹配成功的對象,否則返回None |
2 | re.search(pattern, string, flags=0) | 掃描整個字符串并返回第一次成功匹配的對象,如果匹配失敗,就返回None |
3 | re.findall(pattern, string, flags=0) | 獲取字符串中所有匹配的字符串,并以列表的形式返回 |
4 | re.sub(pattern, repl, string, count=0,flags=0) | 用于替換字符串中的匹配項,如果沒有匹配的項則返回沒有匹配的字符串 |
5 | re.compile(pattern[ ,flags ]) | 用于編譯正則表達式,生成一個正則表達式(Pattern)對象,供match()和search()函數使用 |
import res = "I study Python3.8 every day"print("--------match方法,從起始位置開始匹配--------")print(re.match("I", s).group()) # Iprint(re.match("/w", s).group()) # Iprint(re.match(".", s).group()) # Iprint("--------search方法,從任意位置開始匹配,匹配第一個--------")print(re.search("study", s).group()) # studyprint(re.search("s/w", s).group()) # stprint("--------findall方法,從任意位置開始匹配,匹配多個--------")print(re.findall("y", s)) # 結果為數組 ["y", "y", "y", "y"]print(re.findall("Python", s)) # ["Python"]print(re.findall("P/w+./d", s)) # ["Python3.8"]print(re.findall("P.+/d", s)) # ["Python3.8"]print("--------sub方法的使用,替換功能--------")print(re.sub("study", "like", s)) # 將study替換成like I like Python3.8 every dayprint(re.sub("s/w+", "like", s)) # I like Python3.8 every day
爬取數據時,一定要記得先找F12代碼,看看和爬取的數據是否一致,若一致,則可直接提取。
import reimport requestsurl="http://www.qiushibaike.com/video/"headers={"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"}resp=requests.get(url,headers=headers)# print(resp.text)# 先隨便找一個視頻,看是否能提取到。單引號中的單引號用/轉義:/".../"# info=re.findall("", resp.text)# print(info) # [""]info=re.findall("", resp.text)# print(info) # 給出所有URL的相對位置的數組lst=[]for item in info: lst.append("https:"+item)# print(lst)# 循環count=0for item in lst: count+=1 resp=requests.get(item, headers=headers) # 轉成二進制存儲 with open("video/"+str(count)+".mp4", "wb") as file: file.write(resp.content)print("視頻下載完畢")
用正則表達式提取51job網頁中的信息
import requestsimport refrom pandas import DataFrame # 網址url = "https://search.51job.com/list/000000,000000,0000,32,9,99,Java%25E5%25BC%2580%25E5%258F%2591,2,1.html"# 獲得網頁對象res = requests.get(url)# 設置編碼格式res.encoding = "gbk" # 職位名# 將要提取的用(.*)表示,每條數據不同的地方用.*表示position_pat = "" position = re.findall(position_pat, res.text) # 公司名company_pat = ".*"company = re.findall(company_pat, res.text) # 工作地點place_pat = ".*?(.*?)" # 非貪婪模式place = re.findall(place_pat, res.text, re.S) # 薪資salary_pat = ".*?(.*?)" # 非貪婪模式salary = re.findall(salary_pat, res.text, re.S) # 將取出的信息放到數據框jobInfo = DataFrame([position, company, place, salary]).T# 設置列名jobInfo.columns = ["職位名", "公司名", "工作地點", "薪資"]print(jobInfo.head()) # 將數據保存到本地jobInfo.to_csv("51job2.csv") 四、pyquery解析數據
1、pyquery
- pyquery庫是jQuery的Python實現,就能以jQuery的語法來操作解析HTML文檔,易用性和解析速度都很好
- 前提條件:
- 你對CSS選擇器與jQuery有所了解
- 非Python標準模塊,需要安裝
- 安裝方式
- pip install pyquery
- 測試方式
- import pyquery
2、pyquery的初始化方式
- 字符串方式
- url方式
- 文件
# 字符串方式from pyquery import PyQuery as pyhtml=""" PyQuery PyQuery
"""doc=py(html) # 創建PyQuery的對象,實際上就是在進行一個類型轉換,將str類型轉成PyQuery類型print(doc) # 和html一樣的內容print(type(doc)) # print(type(html)) # print(doc("title")) # PyQuery
# url方式from pyquery import PyQuerydoc=PyQuery(url="http://www.baidu.com", encoding="utf-8")print(doc) # 獲取htmlprint(doc("title")) # 百度一下,你就知道
# 文件from pyquery import PyQuerydoc=PyQuery(filename="a1.html")print(doc) # 獲取htmlprint(doc("h1")) # PyQuery
3、pyquery的使用
序號
提取數據
舉例
1
獲取當前節點
doc("#main")
2
獲取子節點
doc("#main").children()
3
獲取父節點
doc("#main").parent()
4
獲取兄弟節點
doc("#main").siblings()
5
獲取屬性
doc("#main").attr("href")
6
獲取內容
doc("#main").html() doc("#main").text()
from pyquery import PyQueryhtml=""" PyQuery 百度 百度一下
Python學習
"""doc=PyQuery(html)# 獲取當前節點print(doc("#main")) # 獲取整個div# 獲取父節點print(doc("#main").parent()) # 獲取整個body# 獲取子節點print(doc("#main").children()) # 獲取和# # 獲取兄弟節點print(doc("#main").siblings()) # 獲取print("----------獲取屬性------------")print(doc("a").attr("href")) # http://www.baidu.comprint("----------獲取標簽的內容------------")print(doc("#main").html()) # 獲取和,div中的所有都獲取到了print(doc("#main").text()) # 百度 百度一下, 只獲取了div中的文本
4、課堂案例(爬取起點小說網)
import requestsfrom pyquery import PyQueryurl="https://www.qidian.com/rank/yuepiao"headers={"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"}resp=requests.get(url,headers)# print(resp.text)# 初始化PyQuery對象doc=PyQuery(resp.text) # 使用字符串初始化方式初始化PyQuery對象# a_tag=doc("h4 a") # 獲取h4的a標簽# print(a_tag)names=[a.text for a in doc("h4 a")]# print(names) # ["大奉打更人", "這個人仙太過正經", "從紅月開始", "穩住別浪",....]authors = doc("p.author a") # 找
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/124512.html
摘要:以下這些項目,你拿來學習學習練練手。當你每個步驟都能做到很優秀的時候,你應該考慮如何組合這四個步驟,使你的爬蟲達到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學習不是一朝一夕的事情,建議多看看一些比較優秀的爬蟲的設計方案,比如說。 (一)如何學習Python 學習Python大致可以分為以下幾個階段: 1.剛上手的時候肯定是先過一遍Python最基本的知識,比如說:變量、數據結構、語法...
摘要:下載器下載器負責獲取頁面數據并提供給引擎,而后提供給。下載器中間件下載器中間件是在引擎及下載器之間的特定鉤子,處理傳遞給引擎的。一旦頁面下載完畢,下載器生成一個該頁面的,并將其通過下載中間件返回方向發送給引擎。 作者:xiaoyu微信公眾號:Python數據科學知乎:Python數據分析師 在爬蟲的路上,學習scrapy是一個必不可少的環節。也許有好多朋友此時此刻也正在接觸并學習sc...
摘要:在近幾年迅速咋程序界掀起了不小的波瀾,而關于的第三庫也使廣大程序員趨之若鶩,今天我們就由淺入深的探討一下如何使用做一個網絡爬蟲來抓取一些頁面信息。 Python在近幾年迅速咋程序界掀起了不小的波瀾,而關于python的第三庫也使廣大程序員趨之若鶩,今天我們就由淺入深的探討一下如何使用python做一個網絡爬蟲來抓取一些頁面信息。今天我們使用的庫(包含python自身攜帶的庫和第三庫) ...
摘要:在近幾年迅速咋程序界掀起了不小的波瀾,而關于的第三庫也使廣大程序員趨之若鶩,今天我們就由淺入深的探討一下如何使用做一個網絡爬蟲來抓取一些頁面信息。 Python在近幾年迅速咋程序界掀起了不小的波瀾,而關于python的第三庫也使廣大程序員趨之若鶩,今天我們就由淺入深的探討一下如何使用python做一個網絡爬蟲來抓取一些頁面信息。今天我們使用的庫(包含python自身攜帶的庫和第三庫) ...
閱讀 1292·2023-04-26 01:03
閱讀 1907·2021-11-23 09:51
閱讀 3299·2021-11-22 15:24
閱讀 2662·2021-09-22 15:18
閱讀 1010·2019-08-30 15:55
閱讀 3457·2019-08-30 15:54
閱讀 2231·2019-08-30 15:53
閱讀 2387·2019-08-30 15:44