Python中读到了关于这方面的代码,很是疑惑,这里学习记录一下:
etree.XSLT(EXtensible Stylesheet Language Transformations)
用于提取xml文件中的信息。多用于爬虫什么的,能耐挺大,但是需要一些学习成本。详细教程请看。
个人心得
怎么使用我就不介绍了,自己学的也不怎么样,这里记录一下自己遇到的一些用法:
.xslt:
该文件就是具体的规则文件。部分节点的含义:
<xsl:with-param> 元素定义了传递给模板的参数的值。
<xsl:call-template> 元素可调用一个指定的模板。
XSLT <xsl:choose> 元素用于结合 <xsl:when> 和 <xsl:otherwise> 来表达多重条件测试。
<xsl:apply-templates> 元素可把一个模板应用于当前的元素或者当前元素的子节点。
xlst相当于一个匹配规则文件,其中含有层层调用的关系。复杂的xslt文件中的template类似于函数,可以调用该函数,达到复用。
其中如果使用了$,@要了解,$是引用在.xslt中定义的参数,而@则是引用对应要解析的xml文件中的参数。
这里还可以使用如
<xsl:value-of select="ns:Func()"/>
以上是调用了函数,可以在其中添加参数,然后在Python中就可以定义当匹配到该操作时调用的函数。
.py:
from lxml import etree
首先可以定义一个类:
class Factory:
...
def func():
...
也可以继承一个分解器做其他处理:
class LibraryResolver(etree.Resolver):
...
def resolve(self, url, pubid, context):
...
然后就可以使用了:
factory = VariablesInfosFactory()
#定义分解器
parser = etree.XMLParser()
parser.resolvers.add(LibraryResolver())
#name_ns对应的是xmlns:ns=XXX的名称,是<xsl:stylesheet中的属性
tree = etree.XSLT(
etree.parse(os.path.join("XXX.xslt"), parser),
extensions = {("name_ns", name): getattr(factory, name)
for name in ["func"]})
#treeItem为etree.fromstring()的返回类型,对应的是xml文件中对应的一个节点。XXX是在.xslt文件中定义的参数,可以从Python代码端传递进去。
tree(treeItem,XXX=etree.XSLT.strparam(str(XXX)))
这样就可以从xml文件中使用如递归等方式来获取数据,代码量十分精简,就是学习成本较高!