Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用lxml进行Python XPath不区分大小写的搜索?_Python_Xpath_Html Parsing_Lxml_Lowercase - Fatal编程技术网

如何使用lxml进行Python 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

我正在尝试使用XPath中的
小写
函数匹配国家或地区<代码>翻译有点混乱,所以我相信使用小写和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>
  • 我们使用XPath 1.0表达式的一个特定变体来实现XPath 2.0标准函数
    以($text,$s)
    结尾:这是:
  • .2。下一步是,使用
    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会抱怨。“我实际上是通过做……来完成翻译工作的”后面的代码不可能是正确的。回答得很好,但是没有一个例子你是不会赢的。我不是想赢,只是为了帮助你。我想举个例子,但在我看来,这个链接有足够的例子。