我对xpath有疑问
<div id="A" >
<div class="B">
<div class="C">
<div class="item">
<div class="area">
<div class="sec">USA</div>
<table>
<tbody>
<tr>
<td><a href="">D1</a></td>
<td>D2</td>
</tr>
<tr class="even">
<td><a href="">E1</a></td>
<td>E2</td>
</tr>
</tbody>
</table>
</div>
<div class="area">
<div class="sec">UK</div>
<table>
<tbody>
<tr>
<td><a href="">F1</a></td>
<td>F2</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>>
</div>
</div>
我的代码是:
sel = Selector(response)
group = sel.xpath("//div[@id='A']/div[@class='B']/div[@class='C']/div[@class='item']/div[@class='area']/table/tbody/tr")
for g in group:
# section = g.xpath("").extract() #ancestor???
context = g.xpath("./td[1]/a/text()").extract()
brief = g.xpath("./td[2]/text()").extract()
# print section[0]
print context[0]
print brief[0]
它会打印出来:
D1
D2
E1
E2
F1
F2
但我想打印:
USA
D1
D2
USA
E1
E2
UK
F1
F2
所以我需要选择父节点的值,这样我才能得到USA
和UK
我暂时想不通。
请教我谢谢你!
答案 0 :(得分:11)
在 XPath 中,您可以使用..
向后遍历一棵树,因此这样的选择器可能适合您:
section = g.xpath('../../../div[@class="sec"]/text()').extract()
虽然这可行,但它在很大程度上取决于您拥有的确切文档结构。如果您需要更多的灵活性,要说允许对文档进行微小的结构更改,您可以向后搜索这样的祖先:
section = g.xpath('ancestor::div[@class="area"]/div[@class="sec"]/text()').extract()
答案 1 :(得分:5)
http://www.tizag.com/xmlTutorial/xpathparent.php很好的链接。
获取父元素可以通过xpathchild/..
答案 2 :(得分:1)
from lxml import etree, html
import urllib2
a='<div id="A" ><div class="B"><div class="C"><div class="item"><div class="area"><div class="sec">USA</div> <table> <tbody> <tr> <td><a href="">D1</a></td> <td>D2</td> </tr> <tr class="even"> <td><a href="">E1</a></td> <td>E2</td> </tr> </tbody> </table> </div> <div class="area"> <div class="sec">UK</div> <table> <tbody> <tr> <td><a href="">F1</a></td> <td>F2</td> </tr> </tbody> </table> </div> </div> </div> </div> </div>'
tree = etree.fromstring(a)
print filter(lambda x:x.strip(),tree.xpath('//div[@class="area"]//text()'))
输出:['USA','D1','D2','E1','E2','UK','F1','F2']
// - 提取所有后代 / - 仅提取直接子元素