xpath不获取某元素

如:

<div class="content">
<p>
<a>test</a>
<a class="1">test</a>
....
</p>
<p>
<h1>test</h1>
....
</p>
</div>

获取div下的p标签

//div/p

但不要p标签里clsss="1"的a标签。
要的是

<p>
<a>test</a>
....
</p>
<p>
<h1>test</h1>
....
</p>

就是例如content里面可能有不少子元素,但clsss="1"的子元素不需要。
谢谢了

阅读 7.8k
3 个回答

条件为: not(@class="1")

# -*- coding: utf-8 -*-


xml = '''
<div>
<p>
<a>xx</a>
<a class="1">1</a>
<a class="2">2</a>
</p>
</div>
'''

from lxml import etree

root = etree.XML(xml)
for e in root.xpath('//div/p/a[not(@class="1")]'):
    print e.text

如果你要取出两个<p>标签,又不要里面class=1的<a>标签,不如... 换个思路,先把里面的<a class='1'>标签删掉,然后再取出<p>标签?

from lxml import etree

html = """<div class="content">
<p>
<a>test</a>
<a class="1">test</a>
</p>
<p>
<h1>test</h1>
</p>
</div>"""

dom = etree.fromstring(html)
a_list = dom.xpath("//a[contains(@class, '1')]")
for a in a_list:
    parent = a.getparent()
    parent.remove(a)
print(etree.tostring(dom, method="html", encoding="utf-8"))


output: b'<div class="content">\n<p>\n<a>test</a>\n</p>\n<p>\n<h1>test</h1>\n</p>\n</div>'

这样之后再取<p>标签?

新手上路,请多包涵

//div/p/*[not(@class="1")]

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进