xpath獲取標(biāo)簽內(nèi)的包括所有下級標(biāo)簽的所有文字內(nèi)容
現(xiàn)有html源碼如下:
<div>
<ul class="1">
<li>1</li>
<li>12<a>bcd</a></li>
<li>123</li>
<li>1234</li>
</ul>
<ul class="2">
<li>2</li>
<li>22<a>efg</a></li>
<li>223</li>
<li>2234</li>
</ul>
</div>
想要獲取ul class="1"下所有的文字內(nèi)容,即
1
12 bcd
123
1234
可通過xpath的string()函數(shù)實(shí)現(xiàn)
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>
<ul class="2">
<li>2</li>
<li>22<a>bcd</a></li>
<li>223</li>
<li>2234</li>
</ul>
</div>
"""
b = etree.HTML(a)
c = b.xpath('string(//ul)')
print(c)
1
12bcd
123
1234
結(jié)果如上(沒有去掉空白字符),如果想要獲取ul class="2"下所有的文字內(nèi)容,可通過如下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>
<ul class="2">
<li>2</li>
<li>22<a>bcd</a></li>
<li>223</li>
<li>2234</li>
</ul>
</div>
"""
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的第二個(gè)children
c = b.xpath('string(//ul[2])')
- 通過
class屬性定位
c = b.xpath('string(//ul[@class="2"])')
- 先獲取儲存所有
ul的列表,再從列表中獲取第二個(gè)ul,.表示當(dāng)前節(jié)點(diǎn)
b.xpath('//ul')[1].xpath('string(.)')
xpath中text()和string()以及data()的區(qū)別
| 名稱 | 定義 | 用法 |
|---|---|---|
| text() | node test | 僅僅返回所指元素的文本內(nèi)容 |
| string() | 函數(shù) | 返回所指元素的所有節(jié)點(diǎn)文本內(nèi)容,這些文本講會被拼接成一個(gè)字符串 |
| data() | 函數(shù)(可保留數(shù)據(jù)類型) | 和string()函數(shù)通用,不建議經(jīng)常使用,會影響XPath的性能 |