Python爬虫使用xpath要比re简洁高效的多。
简单例子
访问http://www.jikexueyuan.com/course/?pageNum=1,网站信息如下:
我要做的是爬取网页中课程名称、简介、学习人数和课程难度。以下是代码块:
#!/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语句
selector.xpath('//div[@class="lesson-list"]/ul/li/div[@class="lesson-infor"]')
锁定一下需要爬取信息的url位置:
找到"lesson-infor",鼠标右键复制'Copy XPath'
得到的语句如下:
//*[@id="3224"]/div[2]
- ' id="3224" '是唯一标签(课程:腾讯云产品),因此可以写成'//[@id="3224"]/'*
- ''*表示省略了中间路径
- '/div[2]'表示li标签下的第二个div标签
我们需要获取的是所有课程,所以不能用唯一标签
回头看代码:
'//div[@class="lesson-list"]/ul/li/div[@class="lesson-infor"]'
- 它表示先找到class="lesson-list"标签的内容
- 再找该div下ul的内容
- 再找ul下li的内容
- 再找<div class = "lesson-infor">的内容
即图中蓝色部分的内容
ps:当某标签下的子标签唯一时可简写/[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(写在前头)!!!!
- 课程标题处在/h2/a/中
- text()表示返回文本内容
- .[0]表示返回list第一个元素(这个地方新手很容易犯错!!!)
- 因此' title = each.xpath('h2/a/text()')[0] '获取的是标题内容
分析就到此
好好学习,天天向上~