1. 程式人生 > >python在lxml中使用XPath語法進行#資料解析

python在lxml中使用XPath語法進行#資料解析

在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好像對格式不相容,縮排沒辦法顯示