python爬蟲xpath嵌施,BeautifulSoup和正則用法全

from lxml import etree
from bs4 import BeautifulSoup
import re

html = """
<!DOCTYPE html>
<html>
<head>
<title>xpath test</title>
</head>
<body>
<div price="99.8">
<div>
<ul>
<li>時(shí)間</li>
<li>地點(diǎn)</li>
<li>任務(wù)</li>
</ul>
</div>
<div id='testid' data-h="first">
<h2>這里是個(gè)小標(biāo)題</h2>
<ol>
<li data="one">1</li>
<li data="two">2</li>
<li data="three">3</li>
</ol>
<ul>
<li code="84">84</li>
<li code="104">104</li>
<li code="223">223</li>
</ul>
</div>
<div>
<h3>這里是H3的內(nèi)容
<a >百度一下</a>
<ul>
<li>test1</li>
<li>test2</li>
</ul>
</h3>
</div>
<div id="go">
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
<li>10</li>
</ul>
</div>
</div>
</body>
</html>
"""

def title():

#第一種,xpath提取
html_etree = etree.HTML(html)
# print(type(html_etree))  #<class 'lxml.etree._Element'>
# result = etree.tostring(html_etree)  #如果標(biāo)簽不全浙巫,tostring()可以補(bǔ)全
# print(result.decode('utf-8'))  #tostring()后的數(shù)據(jù)類型是bytes金蜀,需要decode()轉(zhuǎn)成str
title_xpath1 = html_etree.xpath('/html/head/title/text()')  #需要text()把文字解析出來
print('用xpath絕對路徑方法提取title:', title_xpath1)  #xpath返回的是列表
title_xpath2 = html_etree.xpath('//head/title/text()')  #效果一樣,/表示絕對路徑的畴,//表示相對路徑
print('用xpath相對路徑方法提取title:', title_xpath2)

#第二種渊抄,BeautifulSoup提取
soup = BeautifulSoup(html, 'lxml')
# print(soup)
# print(type(soup))  #<class 'bs4.BeautifulSoup'>
title_soup = soup.select('title')  #soup.select返回的也是列表,需要提取出來在用get_text()拿出文字
# css選擇器丧裁,標(biāo)簽名不加修飾护桦,類名前加點(diǎn),id名前加#煎娇,可組合查找
# print(title_soup)
# print(type(title_soup))  #list
title_BeautifuleSoup = title_soup[0].get_text()
# title_BeautifuleSoup = soup.title.get_text()
print('用BeautifulSoup方法提取title:', title_BeautifuleSoup)

#第三種二庵,正則表達(dá)式提取
re_pattern = re.compile(r'<title>(.*?)</title>', re.S)  #(.*?)是需要匹配返回的字符串,re.S可換行匹配
# print(type(re_pattern))  #re.compile返回的是數(shù)據(jù)類型正則表達(dá)式:<class 're.Pattern'>
title_re_compile = re.findall(re_pattern, html)
print('用正則表達(dá)式方法提取title:', title_re_compile)
#可以不使用re.compile
title_re = re.findall(r'<title>(.*?)</title>', html)
print('用正則表達(dá)式跳過re.compile提取title:', title_re)

def price():

#第一種,xpath提取
html_etree = etree.HTML(html)
# price_xpath = html_etree.xpath('/html/body/div/@price')
# price_xpath = html_etree.xpath('/html/body/child::*/@price')  #child::*  選取當(dāng)前節(jié)點(diǎn)所有子元素
# price_xpath = html_etree.xpath('/html/body/child::div/@price')  # child::div  子節(jié)點(diǎn)定位div標(biāo)簽
# price_xpath = html_etree.xpath('//@price')  #相對路徑缓呛,且price屬性只有一個(gè)
# price_xpath = html_etree.xpath("http://div[@id='testid']/ancestor::div")  #ancestor::  提取所有父輩div元素
# price_xpath = html_etree.xpath("http://div[@id='testid']/ancestor::div/@price")  #父輩定位div元素price屬性
price_xpath = html_etree.xpath("http://div[@id='testid']/ancestor-or-self::div/@price")  # 父輩及當(dāng)前節(jié)點(diǎn)div元素
print('用xpath方法提取price:', price_xpath)

#第二種催享,BeautifulSoup提取
soup = BeautifulSoup(html, 'lxml')
price_BeautifulSoup = soup.div.attrs['price']
# price_BeautifulSoup = soup.find('div').attrs['price']
# price_BeautifulSoup = soup.select('div')[0].attrs['price']
print('用BeautifulSoup方法提取price:', price_BeautifulSoup)

#第三種,正則表達(dá)式提取
re_pattern = re.compile(r'<div price="(.*?)">', re.S)
price_re = re.findall(re_pattern, html)
print('用正則表達(dá)式跳過re.compile提取price:', price_re)

提取第一個(gè)div下ul下li的文字

def ul_li():

# 第一種哟绊,xpath提取
html_etree = etree.HTML(html)
# ul_li = html_etree.xpath('//div/div[1]/ul/child::*/text()')  #child::節(jié)點(diǎn)子元素方法
# ul_li = html_etree.xpath('//div/div[1]/ul/li/text()')
# ul_li = html_etree.xpath("http://div[@id='testid']/preceding::div/ul/li/text()")  #preceding::  當(dāng)前節(jié)點(diǎn)標(biāo)簽之前的所有節(jié)點(diǎn)因妙,可定點(diǎn)
ul_li = html_etree.xpath("http://div[@id='testid']/preceding::li/text()")  #preceding::  可避免重復(fù)節(jié)點(diǎn)帶來的麻煩
print('用xpath方法提取ul標(biāo)簽下的li的內(nèi)容:', ul_li)

# 第二種,BeautifulSoup提取
soup = BeautifulSoup(html, 'lxml')
# 第一種BeautifulSoup方法
# ul_li = soup.select('ul')[0].select('li')
# ul_li = [i.get_text() for i in ul_li]
#另外一種BeautifulSoup方法
ul_li = soup.div.div.get_text()
ul_li = ul_li.strip()  #刪除首尾空格
ul_li = ul_li.split('\n')  #按換行符分割字符串
print('用BeautifulSoup方法提取ul_li:', ul_li)

# 第三種票髓,正則表達(dá)式提取
re_pattern = re.compile(r'<div price="99.8">.*?<div>.*?<ul>.*?<li>(.*?)</li>.*?<li>(.*?)</li>.*?<li>(.*?)</li>', re.S)
re_ul_li = re.findall(re_pattern, html)
print('用正則表達(dá)式跳過re.compile提取ul_li:', re_ul_li)

def first_id():

# 第一種攀涵,xpath提取
html_etree = etree.HTML(html)
first_id = html_etree.xpath('//div/div[2]/@id')
print('用xpath方法提取first_id的內(nèi)容:', first_id)

# 第二種,BeautifulSoup提取
soup = BeautifulSoup(html, 'lxml')
first_id = soup.select('div')[2].attrs['id']
print('用BeautifulSoup方法提取first_id:', first_id)

# 第三種洽沟,正則表達(dá)式提取
re_comppile = re.compile(r"<div id='(.*?)' data-h=\"first\">", re.S)
first_id = re.findall(re_comppile, html)
print('用正則表達(dá)式跳過re.compile提取first_id:', first_id)

def h2():

# 第一種以故,xpath提取
html_etree = etree.HTML(html)
h2 = html_etree.xpath('//div/div[2]/h2/text()')
print('用xpath方法提取h2的內(nèi)容:', h2)

# 第二種,BeautifulSoup提取
soup = BeautifulSoup(html, 'lxml')
# h2 = soup.select('h2')[0].get_text()
h2 = soup.div.h2.get_text()
print('用BeautifulSoup方法提取h2:', h2)

# 第三種裆操,正則表達(dá)式提取
re_comppile = re.compile(r'<h2>(.*?)</h2>', re.S)
h2 = re.findall(re_comppile, html)
print('用正則表達(dá)式跳過re.compile提取h2:', h2)

def main():
title()
price()
ul_li()
first_id()
h2()

if name == 'main':
main()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末据德,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子跷车,更是在濱河造成了極大的恐慌棘利,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朽缴,死亡現(xiàn)場離奇詭異善玫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門茅郎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜗元,“玉大人,你說我怎么就攤上這事系冗∞瓤郏” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵掌敬,是天一觀的道長惯豆。 經(jīng)常有香客問我,道長奔害,這世上最難降的妖魔是什么楷兽? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮华临,結(jié)果婚禮上芯杀,老公的妹妹穿的比我還像新娘。我一直安慰自己雅潭,他們只是感情好揭厚,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扶供,像睡著了一般筛圆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上诚欠,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機(jī)與錄音漾岳,去河邊找鬼轰绵。 笑死,一個(gè)胖子當(dāng)著我的面吹牛尼荆,可吹牛的內(nèi)容都是我干的左腔。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼捅儒,長吁一口氣:“原來是場噩夢啊……” “哼液样!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起巧还,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤鞭莽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后麸祷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體澎怒,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年阶牍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了喷面。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片星瘾。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖惧辈,靈堂內(nèi)的尸體忽然破棺而出琳状,到底是詐尸還是另有隱情,我是刑警寧澤盒齿,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布念逞,位于F島的核電站,受9級特大地震影響县昂,放射性物質(zhì)發(fā)生泄漏肮柜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一倒彰、第九天 我趴在偏房一處隱蔽的房頂上張望审洞。 院中可真熱鬧,春花似錦待讳、人聲如沸芒澜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痴晦。三九已至,卻和暖如春琳彩,著一層夾襖步出監(jiān)牢的瞬間誊酌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工露乏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碧浊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓瘟仿,卻偏偏與公主長得像箱锐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子劳较,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容