正则表达式 re解析模块 最常规的匹配 1 2 3 4 5 6 7 import recontent = "hello 123 1234 world_this is a regex demo" result = re.match('^hello\s\d\d\d\s\d{4}\s\w{10}.*demo$' ,content) print(result)
泛匹配 1 2 3 4 5 import recontent = "hello 123 1234 world_this is a regex demo" result = re.match('^helle.*demo$' ,content)
匹配目标 1 2 3 4 5 import recontent = "hello 123 1234 world_this is a regex demo" result = re.match('^hello\s(\d+)\sworld.*demo$' ,content) print(result.group(1 ))
贪婪匹配 1 2 3 4 5 6 import recontent = "hello 123 1234 world_this is a regex demo" result = re.match('^he.*(\d+).*demo$' ,content) print(result.group(1 ))
非贪婪匹配 1 2 3 4 5 6 7 import recontent = "hello 123 1234 world_this is a regex demo" result = re.match('^he.*?(\d+).*demo$' ,content) print(result.group(1 ))
匹配模式 1 2 3 4 5 6 7 8 9 import recontent = '''hello 123 1234 world_this is a regex demo ''' result = re.match('^he.*?(\d+).*?demo$' ,content) print(result) result = re.match('^he.*?(\d+).*?demo$' ,content,re.S)
转义 1 2 3 4 5 6 7 8 import recontent1 = 'price is $5.00' result1 = re.match('price is $5.00' ,content) result2 = re.match('price is \$5\.00' ,content) print(result)
总结:尽量使用泛匹配,使用括号得到匹配目标,尽量使用非贪婪模式,要匹配换行符记得参数 re.S
re.search vs re.match
re.findall
re.sub 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import recontent = 'hello 123 1234 world_this isa regex demo' result = re.sub('\d+' ,'hhh' ,content) print(result) import recontent = 'hello 123 1234 world_this isa regex demo' result = re.sub('(\d+)' ,r'\1hhh' ,content) print(result)
re.compile 1 2 3 4 5 6 7 8 import recontent = '''hello 123 1234 world_this is a regex demo''' pattern = re.compile('hello.*' ,re.S) result = re.match(pattern,content) print(result)
BeautifulSoup 解析库 1.Python标准库 用法: BeatufulSoup(markup,’html.parser’) 2.lxml HTML解析器 用法: BeatufulSoup(markup,’lxml’) 3.lxml XML 解析器 用法: BeatufulSoup(markup,’xml’) 4.html5lib 用法: BeatufulSoup(markup,’html5lib’)
1 2 from bs4 import BeatufulSoup
基本用法 1 2 3 4 5 6 7 8 from bs4 import BeatufulSouphtml = ''' 各种标签 ''' soup = BeatifulSoup(html,'lxml' ) print(soup.prettify()) print(soup.title.string)
标签选择器
获取名称
获取属性 1 2 3 soup.标签.attrs['属性名称' ] soup.标签['属性名称' ]
获取内容
嵌套选择
子节点和子孙节点 1 2 3 4 5 6 7 8 soup.标签.contents soup.标签.children soup.标签.decendants
父节点于祖先节点 1 2 3 4 5 soup.标签.parent soup.标签.parent
兄弟节点 1 2 soup.标签.next_siblings soup.标签.previous_siblings
标准选择器 1 2 3 可根据签名,属性,内容查找 soup.find_all('标签' )
attrs 1 soup.find_all(attrs={'属性名' :'属性值' })
text 1 soup.find_all(text='内容' )
find扩展 1 2 3 find:类似find_all,但只返回第一个匹配结果 find_parent() find_parents() find_next_siblings()....等等
CSS选择器
获取内容
PyQuery 像jQuery
初始化 1 from pyquery import PyQuery as pq
字符串初始化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 html = ''' <div id="fakebox-container"> <ul id="fakebox"> <li id="fakebox-search-icon"></li> <li id="fakebox-text"></li> <input id="fakebox-input" autocomplete="off" tabindex="-1" type="url" aria-hidden="true"> <li id="fakebox-cursor"></li> <button id="fakebox-microphone" hidden=""></button> </ul> </div> ''' doc = pq(html) print(doc('标签' ))
URL初始化 1 2 doc = pq(url='' ) print(doc('标签' ))
文件初始化 1 2 doc = pq(filename='路径' ) print(doc('标签' ))
基本CSS选择器 1 2 3 4 html = ''' ''' doc = pq(html) print(doc('# . 签名' ) )
查找元素 子元素 1 2 3 4 html = ''' ''' doc = pq(html) items = doc('.list' ) lis = items.find('li' )
父元素 1 2 3 items.parent() items.parents()
兄弟元素
遍历
获取信息 获取属性
获取文本
获取HTML
DOM操作 addClass、removeClass
attr、css 1 2 .attr('A' ,'B' ) 。css('A' ,'B' )
remove
还有其他很多方法
伪类选择器 1 2 3 doc = pq(html) doc('标签:first-child' ) doc('标签:nth-child(n)' )
Selenium 自动化测试工具,支持多浏览器,爬虫中主要用了解决JavaScript渲染问题
基本使用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.wait import WebDriverWaitbrowser = webdriver.Chrome() try : browser.get('https://www.baidu.com' ) input = browser.find_element_by_id('kw' ) input.send_keys('Python' ) input.send_keys(Keys.ENTER) wait = WebDriverWait(browser,10 ) wait.until(EC.presence_of_element_located((By.ID,'content_left' ))) print(browser.current_url) print(browser.get_cookies()) print(browser.page_source) finally : browser.close()
查找元素 查找单个元素 1 2 3 .find_element_by_id('id' ) .find_elements_by_css_selector('#' ) .find_elements_by_xpath('' )
1 2 3 .find_elements(BY.ID,'id' )
查找多个元素
元素交互操作 1 2 3 4 5 .send_keys('' ) .clear() .click()
交互动作
执行JavaScript 1 2 3 browser = webdriver.Chrome() browser.get('https://www.baidu.com' ) browser.execute_script('js代码' )
获取元素信息 获取属性
获取文本值
获取ID、位置、标签名、大小 1 2 3 4 .id .location .tag_name .size
Frame
等待 确保元素加载完全
隐式等待 到了一定时候发现元素还没加载出来,那继续等,超时抛出异常
显示等待 指定一个等待条件,指定一个最长等待时间,超时抛异常
1 2 3 4 title_is title_contains
前进后退 浏览器的前进后退
1 2 browser.forward() browser.back()
Cookies 1 2 3 4 .get_cookies() .add_cookies() .delete_all_cookise()
选项卡管理 (标签页)
异常处理
pass