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
python lxml在windows和linux上的结果不同_Python_Xpath_Lxml_Elementtree - Fatal编程技术网

python lxml在windows和linux上的结果不同

python lxml在windows和linux上的结果不同,python,xpath,lxml,elementtree,Python,Xpath,Lxml,Elementtree,Linux 来自lxml导入etree的>> >>>html=“” ... ... ''' >>>p=etree.HTML(HTML) >>>a=p.xpath(“//a[1]”) >>>对于我来说,在一个: ... 打印i.text ... a1 a2 窗户 >>> from lxml import etree >>> html='''<td><a href=''>a1</a></td> ... &

Linux

来自lxml导入etree的
>>
>>>html=“”
... 
... '''
>>>p=etree.HTML(HTML)
>>>a=p.xpath(“//a[1]”)
>>>对于我来说,在一个:
...    打印i.text
... 
a1
a2
窗户

>>> from lxml import etree
>>> html='''<td><a href=''>a1</a></td>
... <td><a href=''>a2</a></td>
... '''
>>> p=etree.HTML(html)
>>> a=p.xpath("//a[1]")
>>> for i in a:
...    print i.text
... 
a1
a2
>html=''
... 
... '''
>>>从lxml导入etree
>>>p=etree.HTML(HTML)
>>>a=p.xpath(“//a[1]”)
>>>对于我来说,在一个:
...    打印i.text
...
a1
>>>b=p.xpath(“//a[2]”)
>>>对于b中的i:
...    打印i.text
...
a2
在Windows中,我可以轻松地使用
a[1]
a[2]
来获取这两个值。 但是在Linux中,xpath将这两个链接文本放在一起

这使得程序在这些操作系统中不那么兼容。我必须修改不同操作系统上的代码。
这是lxml模块错误吗?有什么解决办法吗?

我可以确认Linux上的结果与您报告的相同。它返回两个元素的列表,而不是一个元素

xpath
//a[1]
要求什么 它要求任何
元素都是它上下文中的第一个元素

由于
td
中嵌入了
a
元素,
td
是计算位置的上下文,这种情况出现了两次

将xpath更改为
“(//a)[1]”
可以解决此问题

引用

筛选器模式运算符([])的优先级高于路径运算符(/和/)。例如,表达式//comment()[3]选择相对于文档中任何位置的注释父项的索引等于3的所有注释。这与表达式(//comment())[3]不同,后者从相对于父对象的所有注释集中选择第三条注释。第一个表达式可以返回多个注释,而后一个表达式只能返回一个注释

降级损坏的Windows lxml版本3.3.5 xpath
//a[1]
只返回所提供文档的一个元素是完全错误的,应向lxml作者报告

不同平台和操作系统上lxml的状态:

  • Win:lxml2.3.0-正常
  • Win:lxml3.3.5-BUG
  • 林:lxml3.3.5-好的
  • 林:lxml2.3.0-正常
为了使您的解决方案具有可移植性,您需要
lxml==2.3.0
,因为此版本在Windows和Linux上都能正常运行(可能有另一个版本在两种平台上都能正常工作,我没有进行更多测试)

奖金-测试套件 假设您已经安装了
nose

>>> html='''<td><a href=''>a1</a></td>
... <td><a href=''>a2</a></td>
... '''
>>> from lxml import etree
>>> p=etree.HTML(html)
>>> a=p.xpath("//a[1]")
>>> for i in a:
...    print i.text
...
a1
>>> b=p.xpath("//a[2]")
>>> for i in b:
...    print i.text
...
a2
您可以使用以下
test\u xpath.py

$ pip install nose

请澄清您的问题是什么,预期的输出是什么,以及您得到了什么。发布时在stackoverflow编辑器上新增。当我仍在尝试编辑时,您可能会看到我的不完整问题。现在我的问题已更新。无法在Linux上重现该问题。当我运行代码时,它只按预期打印
a1
。我有
lxml-3.3.5
。我用
lmxl 2.3
在linux上复制了这个版本。windows和linux上的lxml和python版本是否相同?你能解释一下为什么linux和windows会有不同吗?谢谢!为了解决问题本身,我只使用`a=p.xpath(“//td//a”)`,然后在Lin和Win中,两者都返回相同的结果。对于潜水到深海,我想你已经解释过了,也得到了其他人的测试,这应该是一个bug。如果我能向作者汇报,我会尽力的。
from lxml import etree
import nose

print "=================================="
print "lxml version: ", etree.__version__
print "=================================="

def test_html():
    html_str = """
    <td><a href=''>a1</a></td>
    <td><a href=''>a2</a></td>
    """
    doc = etree.HTML(html_str.strip())
    elms = doc.xpath("//a[1]")
    assert len(elms) == 2, """xpath `//a[1]` shall return 2 elements"""
    assert all(elm.tag == "a" for elm in elms), "all returned elements shall be `a`"
    assert elms[0].text == "a1"
    assert elms[1].text == "a2"

def test_xml():
    xml_str = """
    <root>
        <td><a href=''>a1</a></td>
        <td><a href=''>a2</a></td>
    </root>
    """
    doc = etree.fromstring(xml_str.strip())
    elms = doc.xpath("//a[1]")
    assert len(elms) == 2, """xpath `//a[1]` shall return 2 elements"""
    assert all(elm.tag == "a" for elm in elms), "all returned elements shall be `a`"
    assert elms[0].text == "a1"
    assert elms[1].text == "a2"

nose.main()
$ python test_xpath.py  -v
==================================
lxml version:  2.3.0
==================================
test_xpath.test_html ... ok
test_xpath.test_xml ... ok

----------------------------------------------------------------------
Ran 2 tests in 0.002s

OK