整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

在编程语言Python中,如何使用xslt提取网页数据

,引言

在Python网络爬虫内容提取器一文我们详细讲解了核心部件:可插拔的内容提取器类gsExtractor。本文记录了确定gsExtractor的技术路线过程中所做的编程实验。这是第一部分,实验了用xslt方式一次性提取静态网页内容并转换成xml格式。

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

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

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

2.1,抓取目标

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

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

Python的优势是用很少量代码就能解决一个问题,请注意下面的代码看起来很长,其实python函数调用没有几个,大篇幅被一个xslt脚本占去了,在这段代码中,只是一个好长的字符串而已,至于为什么选择xslt,而不是离散的xpath或者让人挠头的正则表达式,请参看《Python即时网络爬虫项目启动说明》,我们期望通过这个架构,把程序员的时间节省下来一大半。

可以拷贝运行下面的代码(在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("""\
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match="/">
<列表>
<xsl:apply-templates select="//*[@id='forum' and count(./table/tbody/tr[position()>=1 and count(.//*[@class='topic']/a/text())>0])>0]" mode="列表"/>
</列表>
</xsl:template>

<xsl:template match="table/tbody/tr[position()>=1]" mode="list">
<item>
<标题>
<xsl:value-of select="*//*[@class='topic']/a/text()"/>
<xsl:value-of select="*[@class='topic']/a/text()"/>
<xsl:if test="@class='topic'">
<xsl:value-of select="a/text()"/>
</xsl:if>
</标题>
<回复数>
<xsl:value-of select="*//*[@class='replies']/text()"/>
<xsl:value-of select="*[@class='replies']/text()"/>
<xsl:if test="@class='replies'">
<xsl:value-of select="text()"/>
</xsl:if>
</回复数>
</item>
</xsl:template>

<xsl:template match="//*[@id='forum' and count(./table/tbody/tr[position()>=1 and count(.//*[@class='topic']/a/text())>0])>0]" mode="列表">
<item>
<list>
<xsl:apply-templates select="table/tbody/tr[position()>=1]" mode="list"/>
</list>
</item>
</xsl:template>
</xsl:stylesheet>""")

transform = etree.XSLT(xslt_root)
result_tree = transform(doc)print(result_tree)

2.3,抓取结果

得到的抓取结果如下图:

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

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

from urllib import request
from lxml import etree
import timexslt_root = etree.XML("""\
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match="/">
<列表>
<xsl:apply-templates select="//*[@id='forum' and count(./table/tbody/tr[position()>=1 and count(.//*[@class='topic']/a/text())>0])>0]" mode="列表"/>
</列表>
</xsl:template>

<xsl:template match="table/tbody/tr[position()>=1]" mode="list">
<item>
<标题>
<xsl:value-of select="*//*[@class='topic']/a/text()"/>
<xsl:value-of select="*[@class='topic']/a/text()"/>
<xsl:if test="@class='topic'">
<xsl:value-of select="a/text()"/>
</xsl:if>
</标题>
<回复数>
<xsl:value-of select="*//*[@class='replies']/text()"/>
<xsl:value-of select="*[@class='replies']/text()"/>
<xsl:if test="@class='replies'">
<xsl:value-of select="text()"/>
</xsl:if>
</回复数>
</item>
</xsl:template>

<xsl:template match="//*[@id='forum' and count(./table/tbody/tr[position()>=1 and count(.//*[@class='topic']/a/text())>0])>0]" mode="列表">
<item>
<list>
<xsl:apply-templates select="table/tbody/tr[position()>=1]" mode="list"/>
</list>
</item>
</xsl:template>
</xsl:stylesheet>""")

baseurl = "http://www.gooseeker.com/cn/forum/7"basefilebegin = "jsk_bbs_"basefileend = ".xml"count = 1while (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配合的具体方法。

好了,以上就是小编给大家带来的全部内容,转发此文+关注 并私信小编“资料”即可免费领取2019最新python资料和零基础入门教程,不定期分享干货,欢迎初学和进阶中的小伙伴!

人高等教育在读本科生注意了,申请学位 别忘报考外语省统考。

河南省教育厅消息,2017年河南省成人学士学位外语统考将于2月20日启动报名。各类成人高等教育在读本科生,拟申请获得学士学位者,都须参加此项考试。

统考定于4月23日

河南省成人学士学位外语统考全称为河南省成人高等教育本科毕业生申请学士学位外国语水平统一考试,今年的统考定于4月23日(星期日)上午9时至11时进行。报名采取网上报名与现场确认相结合的方式进行,网上报名时间为2月20日~3月10日,报名网址为http://www.chinadegrees.cn/xsxw/index.html。网上缴费成功且照片审核通过的考生须本人携带第二代居民身份证原件、《报名登记表(样表)》,在高校报考点指定时间内,到规定地点进行现场确认。现场确认工作将于3月17日前完成,报名信息经考生本人签字确认后,一律不得更改。只完成网上报名但未在规定时间内办理现场确认手续的,本次报名无效。

所有语种均不考听力

按照规定,各类成人高等教育在读本科生,拟申请获得学士学位者,都须参加此项考试。考生可报考语种为英语、日语、俄语,所有语种均不考听力。其中,外语类专业的考生应试语种为其所学专业教学计划规定的第二外国语语种。

目前河南省开展成人学士学位授予工作的高校共有40所,考生可通过报名平台查询。所有考生应在规定报名点报名参加考试,否则考试成绩无效。考生在5月中旬可通过河南省学位委员会办公室官方网站(http://xwb.haedu.gov.cn/)查询成绩。考试合格名单将在5月底寄发有关学位授予单位。

“借考生”

在河工大现场确认

省教育厅提醒,在河南省借考的省外高校考生需经其高校所在地省级学位主管部门和省教育厅学位管理与研究生教育处同意后方可报名参加考试。在河南省借考的省外高校考生,只能选择在河南工业大学考点进行现场确认。

据悉,各类成人高等教育本科生自取得学籍(高等教育自学考试考生自参加全国高等教育自学考试开始)即可报名参加学位外语考试,考试合格成绩自下发之日起四年内有效。一次有效的成人学位外语统考合格成绩只能用于向考生所在学位授予单位申请获得一个成人学士学位。高等教育自学考试本科生可在获得本科毕业证书后一年内申请获得学士学位,除高等教育自学考试本科生以外的其他各类成人高等教育本科生在获得本科毕业证书后不得再申请学士学位。(郑报融媒记者 张竞昳)

SLT 是一种用于将 XML 文档转换为 XHTML 文档或其他 XML 文档的语言。

XPath 是一种用于在 XML 文档中进行导航的语言。


您需要具备的基础知识

在您继续学习之前,需要对以下知识有基本的了解:

  • HTML / XHTML

  • XML / XML 命名空间

  • XPath

如果您想要首先学习这些项目,请在我们的首页访问这些教程。


什么是 XSLT?

  • XSLT 指 XSL 转换(XSL Transformations)

  • XSLT 是 XSL 中最重要的部分

  • XSLT 可将一种 XML 文档转换为另外一种 XML 文档

  • XSLT 使用 XPath 在 XML 文档中进行导航

  • XSLT 是一个 W3C 标准


XSLT = XSL 转换

XSLT 是 XSL 中最重要的部分。

XSLT 用于将一种 XML 文档转换为另外一种 XML 文档,或者可被浏览器识别的其他类型的文档,比如 HTML 和 XHTML。通常,XSLT 是通过把每个 XML 元素转换为 (X)HTML 元素来完成这项工作的。

通过 XSLT,您可以向输出文件添加元素和属性,或从输出文件移除元素和属性。您也可重新排列并分类元素,执行测试并决定隐藏或显示哪个元素,等等。

描述转化过程的一种通常的说法是,XSLT 把 XML 源树转换为 XML 结果树


XSLT 使用 XPath

XSLT 使用 XPath 在 XML 文档中查找信息。XPath 被用来通过元素和属性在 XML 文档中进行导航。

如果您想要首先学习 XPath,请访问我们的 XPath 教程。


它如何工作?

在转换过程中,XSLT 使用 XPath 来定义源文档中可匹配一个或多个预定义模板的部分。一旦匹配被找到,XSLT 就会把源文档的匹配部分转换为结果文档。


XSLT 是一个 W3C 标准

XSLT 在 1999 年 11 月 16 日被确立为 W3C 标准。