xpath获取标签内的包括所有下级标签的所有文字内容

xpath获取标签内的包括所有下级标签的所有文字内容

现有html源码如下:

<ul class="1"> <li>1</li> <li>12<a>bcd</a></li> <li>123</li> <li>1234</li> <ul class="2"> <li>2</li> <li>22<a>efg</a></li> <li>223</li> <li>2234</li>

想要获取 ul class="1" 下所有的文字内容,即

12 bcd

可通过xpath的string()函数实现

from lxml import etree
a = """<div>
    <ul class="1">
        <li>1</li>
        <li>12<a>bcd</a></li>
        <li>123</li>
        <li>1234</li>
    <ul class="2">
        <li>2</li>
        <li>22<a>bcd</a></li>
        <li>223</li>
        <li>2234</li>
b = etree.HTML(a)
c = b.xpath('string(//ul)')
print(c)
        12bcd

结果如上(没有去掉空白字符),如果想要获取ul class="2"下所有的文字内容,可通过如下3种方式:

from lxml import etree
a = """<div>
    <ul class="1">
        <li>1</li>
        <li>12<a>bcd</a></li>
        <li>123</li>
        <li>1234</li>
    <ul class="2">
        <li>2</li>
        <li>22<a>bcd</a></li>
        <li>223</li>
        <li>2234</li>
b = etree.HTML(a)
# c = b.xpath('string(//ul[2])')
# c = b.xpath('string(//ul[@class="2"])')
c = b.xpath('//ul')[1].xpath('string(.)')
print(c)
  • 直接选取ul的第二个children
    c = b.xpath('string(//ul[2])')
    
  • 通过class属性定位
  • c = b.xpath('string(//ul[@class="2"])')
    
  • 先获取储存所有ul的列表,再从列表中获取第二个ul,.表示当前节点
  • b.xpath('//ul')[1].xpath('string(.)')
    
    xpath中text()和string()以及data()的区别

    XPath中的text()和string()区别