python在lxml中使用XPath語法進行#資料解析
阿新 • • 發佈:2018-12-29
在lxml中使用XPath語法:
獲取所有li標籤:
from lxml import etree
html = etree.parse('hello.html')
print type(html) # 顯示etree.parse() 返回型別
result = html.xpath('//li')
print(result) # 列印<li>標籤的元素集合
獲取所有li元素下的所有class屬性的值:
from lxml import etree html = etree.parse('hello.html') result = html.xpath('//li/@class') print(result)
獲取li標籤下href為www.baidu.com的a標籤:
from lxml import etree
html = etree.parse('hello.html')
result = html.xpath('//li/a[@href="www.baidu.com"]')
print(result)
獲取li標籤下所有span標籤:
from lxml import etree html = etree.parse('hello.html') #result = html.xpath('//li/span') #注意這麼寫是不對的: #因為 / 是用來獲取子元素的,而 <span> 並不是 <li> 的子元素,所以,要用雙斜槓 result = html.xpath('//li//span') print(result)
獲取li標籤下的a標籤裡的所有class:
from lxml import etree
html = etree.parse('hello.html')
result = html.xpath('//li/a//@class')
print(result)
獲取最後一個li的a的href屬性對應的值:
from lxml import etree
html = etree.parse('hello.html')
result = html.xpath('//li[last()]/a/@href')
# 謂語 [last()] 可以找到最後一個元素
print(result)
獲取倒數第二個li元素的內容:
from lxml import etree
html = etree.parse('hello.html')
result = html.xpath('//li[last()-1]/a')
# text 方法可以獲取元素內容
print(result[0].text)
獲取倒數第二個li元素的內容的第二種方式:
from lxml import etree
html = etree.parse('hello.html')
result = html.xpath('//li[last()-1]/a/text()')
print(result)
使用requests和xpath爬取電影天堂
import requests
from lxml import etree
BASE_DOMAIN = 'http://www.dytt8.net'
HEADERS = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36',
'Referer': 'http://www.dytt8.net/html/gndy/dyzz/list_23_2.html'
}
def spider():
url = 'http://www.dytt8.net/html/gndy/dyzz/list_23_1.html'
resp = requests.get(url,headers=HEADERS)
# resp.content:經過編碼後的字串
# resp.text:沒有經過編碼,也就是unicode字串
# text:相當於是網頁中的原始碼了
text = resp.content.decode('gbk')
# tree:經過lxml解析後的一個物件,以後使用這個物件的xpath方法,就可以
# 提取一些想要的資料了
tree = etree.HTML(text)
# xpath/beautifulsou4
all_a = tree.xpath("//div[@class='co_content8']//a")
for a in all_a:
title = a.xpath("text()")[0]
href = a.xpath("@href")[0]
if href.startswith('/'):
detail_url = BASE_DOMAIN + href
crawl_detail(detail_url)
break
def crawl_detail(url):
resp = requests.get(url,headers=HEADERS)
text = resp.content.decode('gbk')
tree = etree.HTML(text)
create_time = tree.xpath("//div[@class='co_content8']/ul/text()")[0].strip()
imgs = tree.xpath("//div[@id='Zoom']//img/@src")
# 電影海報
cover = imgs[0]
# 電影截圖
screenshoot = imgs[1]
# 獲取span標籤下所有的文字
infos = tree.xpath("//div[@id='Zoom']//text()")
for index,info in enumerate(infos):
if info.startswith("◎年 代"):
year = info.replace("◎年 代","").strip()
if info.startswith("◎豆瓣評分"):
douban_rating = info.replace("◎豆瓣評分",'').strip()
#print(douban_rating)
if info.startswith("◎主 演"):
# 從當前位置,一直往下面遍歷
actors = [info]
for x in range(index+1,len(infos)):
actor = infos[x]
if actor.startswith("◎"):
actors.append(actor.strip())
print(",".join(actors))
if __name__ == '__main__':
spider()
從giebook上覆制過來的,部落格園的markdown好像對格式不相容,縮排沒辦法顯示