python 提取网页数据的通用代码_第一章 Python使用xslt提取网页数据

2.用lxml库实现网页内容提取

lxml是python的一个库,可以迅速、灵活地处理 XML。它支持 XML Path Language (XPath) 和 Extensible Stylesheet Language Transformation (XSLT),并且实现了常见的 ElementTree API。

这2天测试了在python中通过xslt来提取网页内容,记录如下:

2.1.抓取目标

假设要提取集搜客官网旧版论坛的帖子标题和回复数,如下图,要把整个列表提取出来,存成xml格式

d138f09c90877b6b0364db366c71961f.png

2.2.源代码1:只抓当前页,结果显示在控制台

Python的优势是用很少量代码就能解决一个问题,请注意下面的代码看起来很长,其实python函数调用没有几个,大篇幅被一个xslt脚本占去了,在这段代码中,只是一个好长的字符串而已,至于为什么选择xslt,而不是离散的xpath或者让人挠头的正则表达式。

可以拷贝运行下面的代码(在windows10, python3.2下测试通过):

from urllib import request

from lxml import etree

url="http://www.gooseeker.com/cn/forum/7"

conn = request.urlopen(url)

doc = etree.HTML(conn.read())

xslt_root = etree.XML("""\

列表>

标题>

回复数>

""")

transform = etree.XSLT(xslt_root)

result_tree = transform(doc)

print(result_tree)

2.3.抓取结果

得到的抓取结果如下图:

8e6560003508391dbfe4eb5f4515168c.png

2.4.源代码2:翻页抓取,结果存入文件

我们对2.2的代码再做进一步修改,增加翻页抓取和存结果文件功能,代码如下:

from urllib import request

from lxml import etree

import time

xslt_root = etree.XML("""\

列表>

标题>

回复数>

""")

baseurl ="http://www.gooseeker.com/cn/forum/7"

basefilebegin ="jsk_bbs_"

basefileend =".xml"

count =1

while (count <12):

url = baseurl +"?page="+str(count)

conn = request.urlopen(url)

doc = etree.HTML(conn.read())

transform = etree.XSLT(xslt_root)

result_tree = transform(doc)

print(str(result_tree))

file_obj =open(basefilebegin+str(count)+basefileend,'w',encoding='UTF-8')

file_obj.write(str(result_tree))

file_obj.close()

count +=1

time.sleep(2)

我们增加了写文件的代码,还增加了一个循环,构造每个翻页的网址,但是,如果翻页过程中网址总是不变怎么办?其实这就是动态网页内容,下面会讨论这个问题。

3.总结

这是开源Python通用爬虫项目的验证过程,在一个爬虫框架里面,其它部分都容易做成通用的,就是网页内容提取和转换成结构化的操作难于通用,我们称之为提取器。但是,借助GooSeeker可视化提取规则生成器MS谋数台 ,提取器的生成过程将变得很便捷,而且可以标准化插入,从而实现通用爬虫,在后续的文章中会专门讲解MS谋数台与Python配合的具体方法。

End.

作者:华天清

来源:知乎

本文均已和作者授权,如转载请与作者联系。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值