网页爬虫可以使用Python的正则模块(re), 当然我今天要隆重推荐的是xpath.
xpath需要安装xpath的基础包:lxml
首先看一个例子:(爬取果壳的最新推荐文章列表)
import requests
from lxml import etree
url = 'http://www.guokr.com/'
page = requests.get(url).content
s = etree.HTML(page)
h = s.xpath('/html/body/div[1]/div[2]/div[1]/div[2]/div[2]/ul/li/h2/a/text()')
for i in h:
print i
输出结果是:
早餐!早餐!
蚂蚁为什么会绕着手机转圈走?
蚂蚁、蜜蜂都是近亲繁殖吗?
大王乌贼的吃法 怎样用药才安全?
五个“第一次”,
蚁人跑起来会跟正常大小的人一样吗?
巧克力分子学: 丝滑口感,卵磷脂造
同样, 可以通过@href来获取链接, ,通过 @属性名
h = s.xpath('/html/body/div[1]/div[2]/div[1]/div[2]/div[2]/ul/li/h2/a/@href')
for i in h:
print i
如下:
http://www.guokr.com/post/699154/
http://www.guokr.com/question/612229/
http://www.guokr.com/question/612052/
http://www.guokr.com/post/699178/
http://www.guokr.com/post/699188/
http://www.guokr.com/article/440679/
http://www.guokr.com/article/440684/
http://www.guokr.com/article/440681/
很简单, 重点是获取 xpath 的路径表达式来定位
在这里稍稍介绍一下xpath的语法:
- //定位根节点
- /往下寻找节点
- 提取文本内容: /text()
- 提取属性内容:/@hello
当然, 通常我们会通过一些工具来快速获取网页元素的xpath, 比如Chrome: 右键–>”审查元素”–>相应元素右键–>Copy XPath 就可以获得元素的xpath.
提取结果如下:
/html/body/div[1]/div[2]/div[1]/div[2]/div[2]/ul/li[4]/h2/a
然后稍作修改:
加提取文本后缀/text():
/html/body/div[1]/div[2]/div[1]/div[2]/div[2]/ul/li[4]/h2/a/text()
为了提取更通用, 将最后一个li[4]标签的4删除, 匹配所有项目,而不是第四条内容 /html/body/div[1]/div[2]/div[1]/div[2]/div[2]/ul/li[4]/h2/a/text()
/html/body/div[1]/div[2]/div[1]/div[2]/div[2]/ul/li/h2/a/text()
如果需要提取的一组标签的名字不一样,但开始部分一样, 可以startwith: ‘//div[startwith[@id(标签属性), ‘hello’)]/text()’