lxml是python的一个库,可以迅速、灵活地处理XML。它支持XMLPathLangu"/>

Python使用xslt提取网页数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python使用xslt提取网页数据相关的知识,希望对你有一定的参考价值。

技术分享

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

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

1. 要提取集搜客官网旧版论坛的帖子标题和回复数

技术分享 


2. 运行下面的代码(在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)


3. 得到抓取结果

技术分享 


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


修改了一下,增加了:1.翻页 2.抓取结果写入文件
更新后的代码如下:

from urllib import request
from lxml import etree
import time
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>""")
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)


本文出自 “fullerhua的博客” 博客,谢绝转载!

以上是关于Python使用xslt提取网页数据的主要内容,如果未能解决你的问题,请参考以下文章

Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容

使用 XSLT 从网站中提取数据

使用 XSLT 从 XML 中查询和提取数据

Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容

使用 XSLT 从 JSON 输出中提取特定字段

python,提取HTML中左右没有标签的内容,怎么提取?