用lxml和xpath获取了10个 element,但是不能再遍历每个li用xpath获取li里面的a标签

时间:2022-12-09 00:03:43
html是这样的:
<li class="lx1">
<div class="tit">
<a href="#">链接</a>
</div>
<div class="inf">
...
</div>
</li>
<li class="lx1">
<div class="tit">
<a href="#">链接</a>
</div>
<div class="inf">
...
</div>
</li>
<li class="lx1">
<div class="tit">
<a href="#">链接</a>
</div>
<div class="inf">
...
</div>
</li>

我先用'//div[@class="lx1"]'获取所有的li,现在取到的是一个list,里面是etree的element,

然后再for i in elements:循环再对每个i用xpath查询'//div[@class='tit']/a/text()'来获取每个li下面的a标签的文字,

但是我用i.xpath()取获取到的a标签不止当前li下面的,它就像是对整个html执行了这个xpath,把其他li下面的a也查出来了。。。

望各位指正一下

7 个解决方案

#1



'.//div[@class='tit']/a/text()'

#2


引用 1 楼 oyljerry 的回复:

'.//div[@class='tit']/a/text()'

版主,是不是取出来的<li>的list再用xpath的话实际上是对整个页面使用的啊?我打印每个li都是不一样的,但是只要用xpath去每个li里面再去取东西就会把整个html里面的a都取出来,懵逼

#3


你用for i in elements:应该都会查出来吧

#4


感觉并没有
import xml.etree.ElementTree as etree
tree =etree.parse('text.xml')
lis=tree.findall("//li[@class='{}']".format('lx1'))
for li in lis:
    print(li)
    aa=li.findall(".//div[@class='{}']/a".format('tit'))
    for a in aa:
        print(a.text)

输出:
<Element 'li' at 0x7f491d1530e8>
链接1
链接1.1
<Element 'li' at 0x7f4914feb4f8>
链接2
<Element 'li' at 0x7f4914feb638>
链接3

text.xml:
<root>
<li class="lx1">
<div class="tit">
<a href="#">链接1</a>
</div>
<div class="inf">
<div class="tit">
<a href="#">链接1.1</a>
</div>
</div>
</li>
<li class="lx1">
<div class="tit">
<a href="#">链接2</a>
</div>
<div class="inf">
...
</div>
</li>
<li class="lx1">
<div class="tit">
<a href="#">链接3</a>
</div>
<div class="inf">
...
</div>
</li>
</root>


#5


引用 4 楼 hbu_pig 的回复:
感觉并没有
import xml.etree.ElementTree as etree
tree =etree.parse('text.xml')
lis=tree.findall("//li[@class='{}']".format('lx1'))
for li in lis:
    print(li)
    aa=li.findall(".//div[@class='{}']/a".format('tit'))
    for a in aa:
        print(a.text)

输出:
<Element 'li' at 0x7f491d1530e8>
链接1
链接1.1
<Element 'li' at 0x7f4914feb4f8>
链接2
<Element 'li' at 0x7f4914feb638>
链接3

text.xml:
<root>
<li class="lx1">
<div class="tit">
<a href="#">链接1</a>
</div>
<div class="inf">
<div class="tit">
<a href="#">链接1.1</a>
</div>
</div>
</li>
<li class="lx1">
<div class="tit">
<a href="#">链接2</a>
</div>
<div class="inf">
...
</div>
</li>
<li class="lx1">
<div class="tit">
<a href="#">链接3</a>
</div>
<div class="inf">
...
</div>
</li>
</root>

我没有用findall用了两次xpath就会查出所有的,用老哥你这样的就没问题,感谢了,我看看为啥子会有这种区别

#6


上午弄来弄去最后每次我先把for i in eles: 的i转换为str,然后我再把它转换etree.HTML(str),再查就不会把所有的查出来,感觉好蠢啊

#7


推荐你用更简单的库 pyquery
https://www.cnblogs.com/lei0213/p/7676254.html

#1



'.//div[@class='tit']/a/text()'

#2


引用 1 楼 oyljerry 的回复:

'.//div[@class='tit']/a/text()'

版主,是不是取出来的<li>的list再用xpath的话实际上是对整个页面使用的啊?我打印每个li都是不一样的,但是只要用xpath去每个li里面再去取东西就会把整个html里面的a都取出来,懵逼

#3


你用for i in elements:应该都会查出来吧

#4


感觉并没有
import xml.etree.ElementTree as etree
tree =etree.parse('text.xml')
lis=tree.findall("//li[@class='{}']".format('lx1'))
for li in lis:
    print(li)
    aa=li.findall(".//div[@class='{}']/a".format('tit'))
    for a in aa:
        print(a.text)

输出:
<Element 'li' at 0x7f491d1530e8>
链接1
链接1.1
<Element 'li' at 0x7f4914feb4f8>
链接2
<Element 'li' at 0x7f4914feb638>
链接3

text.xml:
<root>
<li class="lx1">
<div class="tit">
<a href="#">链接1</a>
</div>
<div class="inf">
<div class="tit">
<a href="#">链接1.1</a>
</div>
</div>
</li>
<li class="lx1">
<div class="tit">
<a href="#">链接2</a>
</div>
<div class="inf">
...
</div>
</li>
<li class="lx1">
<div class="tit">
<a href="#">链接3</a>
</div>
<div class="inf">
...
</div>
</li>
</root>


#5


引用 4 楼 hbu_pig 的回复:
感觉并没有
import xml.etree.ElementTree as etree
tree =etree.parse('text.xml')
lis=tree.findall("//li[@class='{}']".format('lx1'))
for li in lis:
    print(li)
    aa=li.findall(".//div[@class='{}']/a".format('tit'))
    for a in aa:
        print(a.text)

输出:
<Element 'li' at 0x7f491d1530e8>
链接1
链接1.1
<Element 'li' at 0x7f4914feb4f8>
链接2
<Element 'li' at 0x7f4914feb638>
链接3

text.xml:
<root>
<li class="lx1">
<div class="tit">
<a href="#">链接1</a>
</div>
<div class="inf">
<div class="tit">
<a href="#">链接1.1</a>
</div>
</div>
</li>
<li class="lx1">
<div class="tit">
<a href="#">链接2</a>
</div>
<div class="inf">
...
</div>
</li>
<li class="lx1">
<div class="tit">
<a href="#">链接3</a>
</div>
<div class="inf">
...
</div>
</li>
</root>

我没有用findall用了两次xpath就会查出所有的,用老哥你这样的就没问题,感谢了,我看看为啥子会有这种区别

#6


上午弄来弄去最后每次我先把for i in eles: 的i转换为str,然后我再把它转换etree.HTML(str),再查就不会把所有的查出来,感觉好蠢啊

#7


推荐你用更简单的库 pyquery
https://www.cnblogs.com/lei0213/p/7676254.html