Python爬蟲(chóng)使用xpath要比re簡(jiǎn)潔高效的多美浦。
簡(jiǎn)單例子
訪問(wèn)http://www.jikexueyuan.com/course/?pageNum=1树酪,網(wǎng)站信息如下:
我要做的是爬取網(wǎng)頁(yè)中課程名稱、簡(jiǎn)介崩掘、學(xué)習(xí)人數(shù)和課程難度衣摩。以下是代碼塊:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from lxml import etree
import requests
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
url = 'http://www.jikexueyuan.com/course/?pageNum=1'
html = requests.get(url)
selector = etree.HTML(html.text)
content_field = selector.xpath('//div[@class="lesson-list"]/ul/li/div[@class="lesson-infor"]')
for each in content_field:
title = each.xpath('h2/a/text()')[0]
info = (each.xpath('p/text()')[0]).strip()
time = (each.xpath('div/div[1]/dl/dd[1]/em/text()')[0]).replace('\t','').replace('\n', ' ')
number = each.xpath('div/div[1]/em/text()')[0]
level = each.xpath('div/div[1]/dl/dd[2]/em/text()')[0]
print title
print info
print time
print number
print level + '\n'
效果如下
1. 首先分析一下xpath語(yǔ)句
selector.xpath('//div[@class="lesson-list"]/ul/li/div[@class="lesson-infor"]')
鎖定一下需要爬取信息的url位置:
找到"lesson-infor"鹅士,鼠標(biāo)右鍵復(fù)制'Copy XPath'
得到的語(yǔ)句如下:
//*[@id="3224"]/div[2]
- ' id="3224" '是唯一標(biāo)簽(課程:騰訊云產(chǎn)品),因此可以寫成'//[@id="3224"]/'*
- ''*表示省略了中間路徑
- '/div[2]'表示li標(biāo)簽下的第二個(gè)div標(biāo)簽
我們需要獲取的是所有課程轰胁,所以不能用唯一標(biāo)簽
回頭看代碼:
'//div[@class="lesson-list"]/ul/li/div[@class="lesson-infor"]'
- 它表示先找到class="lesson-list"標(biāo)簽的內(nèi)容
- 再找該div下ul的內(nèi)容
- 再找ul下li的內(nèi)容
- 再找<div class = "lesson-infor">的內(nèi)容
即圖中藍(lán)色部分的內(nèi)容
ps:當(dāng)某標(biāo)簽下的子標(biāo)簽唯一時(shí)可簡(jiǎn)寫/[label]/谒主,如代碼中'/div/ul'
2. 接著分析這幾句代碼:
for each in content_field:
title = each.xpath('h2/a/text()')[0]
info = (each.xpath('p/text()')[0]).strip()
注意: xpath返回值是list(寫在前頭)!T叻Аv稀!
- 課程標(biāo)題處在/h2/a/中
- text()表示返回文本內(nèi)容
- .[0]表示返回list第一個(gè)元素(這個(gè)地方新手很容易犯錯(cuò)!!!)
- 因此' title = each.xpath('h2/a/text()')[0] '獲取的是標(biāo)題內(nèi)容
分析就到此
好好學(xué)習(xí)榛斯,天天向上~