scrapy xpath:选择祖先节点

时间:2014-10-23 08:16:44

标签: python xpath scrapy

我对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

所以我需要选择父节点的值,这样我才能得到USAUK
我暂时想不通。
请教我谢谢你!

3 个答案:

答案 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']

// - 提取所有后代 / - 仅提取直接子元素