2019-03-26學(xué)習(xí)筆記 報(bào)錯(cuò)的解決方法+技術(shù)選型問(wèn)題

【環(huán)境配置】出現(xiàn):Microsoft Visual C++ 14.0 is required 的解決方案
如:pip install scrapy 時(shí)出現(xiàn):

錯(cuò)誤信息

error: Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visual C++ Build Tools”: http://landinghub.visualstudio.com/visual-cpp-build-tools
說(shuō)明計(jì)算機(jī)中缺少M(fèi)icrosoft Visual C++ 14.0
但錯(cuò)誤信息中提供的網(wǎng)址是無(wú)效的,需要自行從網(wǎng)絡(luò)中下載安裝MV C++14.0

可以使用以下鏈接進(jìn)行下載安裝:
鏈接:https://pan.baidu.com/s/1G7DomtDZG0GpgSVZXloscw
提取碼:ik9k

技術(shù)選型:

  • request和beautifulsoup都是庫(kù),scrapy是框架
  • scrapy框架中可以加入request和beautifulsoup的庫(kù)
  • scrapy基于twisted,性能是最大的優(yōu)勢(shì)
  • scrapy方便擴(kuò)展,提供了很多內(nèi)置的功能
  • scrapy內(nèi)置的CSS和xpathselector方便,beautifulsoup的缺點(diǎn)是慢

網(wǎng)頁(yè)分類:

  1. 靜態(tài)頁(yè)面
  2. 動(dòng)態(tài)頁(yè)面
  3. webservices(restapi)

爬蟲(chóng)能做什么:

  • 搜索引擎
  • 推薦引擎
  • 機(jī)器學(xué)習(xí)的數(shù)據(jù)樣本
  • 數(shù)據(jù)分析、輿情分析

正則表達(dá)式:

出現(xiàn)問(wèn)題:pycharm授權(quán)賬戶過(guò)期
建議更新賬戶后下載離線激活碼使用


下載離線激活碼
  1. 新建python工程
  2. 新建的python工程使用虛擬環(huán)境,在創(chuàng)建時(shí)會(huì)自動(dòng)下載安裝setuptools,pip,wheel等
  3. 在工程下新建名為“test”的pythonpackage的文件


    新建py工程與py文件

特殊字符

  • ^: 表達(dá)必須以某一字符開(kāi)頭的含義,^1即為字符串以1開(kāi)頭.
  • $: 結(jié)尾字符必須為x,例如3$就是說(shuō)明字符串是以3結(jié)尾
  • .: 替代一個(gè)任意字符(中英文 大小寫(xiě)等等)
  • *: 某一字符重復(fù)多次,放在該字符后>=0
  • ?: 服貪婪匹配方式,在量詞后面直接加上一個(gè)問(wèn)號(hào)?就是非貪婪模式。
  • +: 前面的字符必須至少出現(xiàn)一次 >=1
  • {2}: 限定前面字符出現(xiàn)的次數(shù),{2}表示限定前面的字符出現(xiàn)2次,{2,}表示前面一個(gè)字符出現(xiàn)大于兩次,{2,5}表示前面一個(gè)字符出現(xiàn)大于等于2次且小于等于5次
  • |: 表示或的關(guān)系,例如booby|booby123表達(dá)提取booby或booby123,哪個(gè)在前優(yōu)先匹配哪一個(gè)。
  • []: 表示只要滿足中括號(hào)中的任意字符即可。
  • [0-9]表示范圍限制在0-9之間匹配任意數(shù)值均可。
  • 中括號(hào)中的*就是星號(hào),.就是點(diǎn)號(hào),不再具有上面所說(shuō)的特殊替代含義。
  • \s: 表示空格 小寫(xiě)
  • \S: 只要不為空格都可以 大寫(xiě)
  • \w: 表示任意字符[A-Z,a-z, 0-9,_],匹配字母或數(shù)字或下劃線或漢字 小寫(xiě)
  • \W: 和\w相對(duì)應(yīng)的字符 大寫(xiě)
  • [\u4E00-\u9FA5] : 代表漢字
  • \d: 代表數(shù)字

1. 匹配以b開(kāi)頭,后面為任意字符

import re #使用正則表達(dá)式的包

line="booby123"
regex_str="^b.*"
if re.match(regex_str,line): #re.match()是re包中的模塊
    print("yes")

2.使用?克服貪婪匹配

import re

line="boooooobby123"
regex_str=".*(b.*b).*" #提取括號(hào)中的內(nèi)容
match_obj=re.match(regex_str,line)
if match_obj:
    print(match_obj.group(1))

輸出結(jié)果為:bb

貪婪匹配:正則表達(dá)式一般趨向于最大長(zhǎng)度匹配,也就是所謂的貪婪匹配。
非貪婪匹配:就是匹配到結(jié)果就好,就少的匹配字符。

當(dāng)兩側(cè)都無(wú)?控制的情況下,類似于反向匹配,即從右側(cè)開(kāi)始匹配(如上所示)
當(dāng)左側(cè)有?控制且右側(cè)無(wú)?控制的情況下,則從左側(cè)開(kāi)始匹配得到最長(zhǎng)的結(jié)果為止(如下所示)

import re

line="boooooobby123"
regex_str=".*?(b.*b).*"
match_obj=re.match(regex_str,line)
if match_obj:
    print(match_obj.group(1))

輸出結(jié)果為boooooobb

正確表達(dá)式應(yīng)為

import re

line="boooooobby123"
regex_str=".*?(b.*?b).*"
match_obj=re.match(regex_str,line)
if match_obj:
    print(match_obj.group(1))

3.使用+的實(shí)例

  • 沒(méi)有使用+的情況
import re

line="boooooobnnvccbby123"
regex_str=".*(b.*b).*"
match_obj=re.match(regex_str,line)
if match_obj:
    print(match_obj.group(1))

結(jié)果:bb

  • 使用+的情況
import re

line="boooooobnnvccbby123"
regex_str=".*(b.+b).*"
match_obj=re.match(regex_str,line)
if match_obj:
    print(match_obj.group(1))

結(jié)果:bnnvccbb
4.使用{}的實(shí)例

  • 限定字符出現(xiàn)一次
import re

line="boooooobnnvccbaby123"
regex_str=".*(b.{1}b).*"
match_obj=re.match(regex_str,line)
if match_obj:
    print(match_obj.group(1))

結(jié)果:bab

  • 限定字符出現(xiàn)1~3次
import re

line="boooooobnnvccbaaaby123"
regex_str=".*(b.{1,3}b).*"
match_obj=re.match(regex_str,line)
if match_obj:
    print(match_obj.group(1))

結(jié)果:baaab
5.使用|的實(shí)例

import re

line="booby123"
regex_str="(booby|booby123)"
match_obj=re.match(regex_str,line)
if match_obj:
    print(match_obj.group(1))

結(jié)果:booby
6.使用[]的實(shí)例

import re

line="booby123"
regex_str="([abcd]ooby123)"
match_obj=re.match(regex_str,line)
if match_obj:
    print(match_obj.group(1))

結(jié)果:booby123
7.使用[0-9]的實(shí)例

import re

line="15764289384"
regex_str="(1[3578][0-9]{9})"
#第一位數(shù)字為1,第二位數(shù)字為3 5 7 8 中的任意一個(gè),之后為9個(gè)0-9之間的字符
match_obj=re.match(regex_str,line)
if match_obj:
    print(match_obj.group(1))

結(jié)果:15764289384

8. 使用\s\S的實(shí)例

import re

line="你 好"
regex_str="(你\s好)"
match_obj=re.match(regex_str,line)
if match_obj:
    print(match_obj.group(1))

結(jié)果:你 好

import re

line="你很不好"
regex_str="(你\S+好)"
match_obj=re.match(regex_str,line)
if match_obj:
    print(match_obj.group(1))

結(jié)果:你很不好

9. 使用\w\W的實(shí)例

import re

line="你S好"
regex_str="(你\w好)"
match_obj=re.match(regex_str,line)
if match_obj:
    print(match_obj.group(1))

結(jié)果:你S好

10. 使用[\u4E00-\u9FA5]的實(shí)例

import re

line="你 好"
regex_str="([\u4E00-\u9FA5]+)"
match_obj=re.match(regex_str,line)
if match_obj:
    print(match_obj.group(1))

結(jié)果:你

import re

line="stydy in 南京大學(xué)"
regex_str=".*?([\u4E00-\u9FA5]+大學(xué))"
match_obj=re.match(regex_str,line)
if match_obj:
    print(match_obj.group(1))

結(jié)果:南京大學(xué)

11.使用\d的實(shí)例

import re

line="XXX出生于2001年"
regex_str=".*?(\d+)年"
match_obj=re.match(regex_str,line)
if match_obj:
    print(match_obj.group(1))

結(jié)果:2001年

正則表達(dá)式練習(xí)

匹配不同的出生日期寫(xiě)法:

import re

#line="XXX出生于2001年6月1日"
#line="XXX出生于2001/6/1"
#line="XXX出生于2001-06-01"
line="XXX出生于2001-06"
regex_str= '.*?出生于(\d{4}[年/-]\d{1,2}([月/-]\d{1,2}|[月/-]$|$))'
match_obj=re.match(regex_str,line)
if match_obj:
    print(match_obj.group(1))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容