如何使用lxml进行Python XPath不区分大小写的搜索?
我正在尝试使用XPath中的如何使用lxml进行Python XPath不区分大小写的搜索?,python,xpath,html-parsing,lxml,lowercase,Python,Xpath,Html Parsing,Lxml,Lowercase,我正在尝试使用XPath中的小写函数匹配国家或地区翻译有点混乱,所以我相信使用小写和Python版本2.6.6支持XPath2.0,因为小写只能在XPath2.0中使用 如何在我的案例中使用小写是我正在寻找的。希望这个例子是不言自明的。我正在寻找['USA','US']作为输出(如果小写字母评估国家和国家相同,两个国家可以一次性完成) HTML:doc.htm <html> <table> <tr> <td
小写
函数匹配国家或地区<代码>翻译有点混乱,所以我相信使用小写和Python版本2.6.6支持XPath2.0,因为小写只能在XPath2.0中使用
如何在我的案例中使用小写是我正在寻找的。希望这个例子是不言自明的。我正在寻找['USA','US']
作为输出(如果小写字母评估国家和国家相同,两个国家可以一次性完成)
HTML:doc.htm
<html>
<table>
<tr>
<td>
Name of the Country : <span> USA </span>
</td>
</tr>
<tr>
<td>
Name of the country : <span> UK </span>
</td>
</tr>
</table>
现在问题仍然存在,我是否可以将translate部分存储为全局变量“handlecase”,并在执行XPath时打印该全局变量
类似的方法有效:
import lxml.html as lh
doc = open('doc.htm', 'r')
out = lh.parse(doc)
doc.close()
print out.xpath('//table/tr/td[text()[contains(. , "Country")]]/span/text()')
# Prints : [' USA ']
print out.xpath('//table/tr/td[text()[contains(. , "country")]]/span/text()')
# Prints : [' UK ']
print out.xpath('//table/tr/td[lower-case(text())[contains(. , "country")]]/span/text()')
# Prints : [<Element td at 0x15db2710>]
handlecase = """translate(., "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz")"""
out.xpath('//table/tr/td[text()[contains(%s , "country")]]/span/text()' % (handlecase))
<html>
<table>
<tr>
<td>
Name of the Country : <span> USA </span>
</td>
</tr>
<tr>
<td>
Name of the country : <span> UK </span>
</td>
</tr>
</table>
</html>
USA UK
但为了简单易懂,我想这样运行它:
out.xpath('//table/tr/td[text()[contains(handlecase , "country")]]/span/text()')
我相信最简单的方法就是编写一个XPath扩展函数 通过这样做,您可以编写一个
lower-case()
函数,或者编写一个不区分大小写的搜索
您可以在此处找到详细信息:使用:
//td[translate(substring(text()[1], string-length(text()[1]) - 9),
'COUNTRY :',
'country'
)
=
'country'
]
/span/text()
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select=
"//td[translate(substring(text()[1], string-length(text()[1]) - 9),
'COUNTRY :',
'country'
)
=
'country'
]
/span/text()
"/>
</xsl:template>
</xsl:stylesheet>
基于XSLT的验证:
//td[translate(substring(text()[1], string-length(text()[1]) - 9),
'COUNTRY :',
'country'
)
=
'country'
]
/span/text()
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select=
"//td[translate(substring(text()[1], string-length(text()[1]) - 9),
'COUNTRY :',
'country'
)
=
'country'
]
/span/text()
"/>
</xsl:template>
</xsl:stylesheet>
说明:
//td[translate(substring(text()[1], string-length(text()[1]) - 9),
'COUNTRY :',
'country'
)
=
'country'
]
/span/text()
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select=
"//td[translate(substring(text()[1], string-length(text()[1]) - 9),
'COUNTRY :',
'country'
)
=
'country'
]
/span/text()
"/>
</xsl:template>
</xsl:stylesheet>
以($text,$s)
结尾:这是:translate()
函数将结束的10个字符长的字符串转换为小写,消除任何空格或“:”字符
.3。如果结果是字符串(全部小写)“country”,那么我们选择s=
span
这个td
的子节点的子文本节点(在本例中只有一个),来自:lxml支持XPath 1.0
;因此,对于lxml,您必须使用translate。在这种情况下,我不知道为什么我使用小写时它不会抱怨。在这个示例场景中,我也没有太多机会使用“translate”。非常感谢。谢谢你的链接。这与其说是翻译,不如说是一个“小写”的讨论。实际上,我通过执行以下操作实现了翻译:out.xpath('//table/tr/td[小写(text())[包含(translate(,“abcdefghjjklmnopqrstuvxyz”,“abcdefghjjklmnopqrstuvxyz”),“country”)]/span/text()。如果在这种情况下不能使用小写,Mods可能会关闭此功能。非常感谢。但是如果您使用小写()
:“lxml.etree.xpathevaleror:Unregistered function”,lxml会抱怨。“我实际上是通过做……来完成翻译工作的”后面的代码不可能是正确的。回答得很好,但是没有一个例子你是不会赢的。我不是想赢,只是为了帮助你。我想举个例子,但在我看来,这个链接有足够的例子。