关于python:使用Xpath轴提取前一个元素

Using Xpath axes to extract preceding element

我正试图从下面这个结构的站点中获取数据。我想从每个

  • 中提取信息,但这两个条目也应该从
  • / 中提取类别信息。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <ul class="html-winners">
        <li id="category">
            Redaktionell Print - Dagstidning
           
    <ul>

                <li id="entry">
                   
                       
                            <img src="bilder/tumme10/4.jpg" width="110" height="147">
                            <span class="gold">Guld: Svenska Dagbladet</span>
                             Designer: Anna W Thurfjell och SvD:s medarbetare
                           Motivering:"Konsekvent design som ?r l?tt igenk?nningsbar. Sm? f?r?ndringar f?rnyar st?ndigt och blldmotiven utnyttjas f?red?mligt."
                       
                   
             
    </li>

              <li  id="entry">
                   
                        <img src="bilder/tumme10/3.jpg" width="110" height="147">
                            <span class="silver">Silver: K2 - Kristianstadsbladet</span>
                       
                   
               
    </li>

           
    </ul>

       
    </li>

    我用一个带有以下代码的剪贴画:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    start_urls = [
       "http://www.designpriset.se/vinnare.php?year=2010"
    ]

    rules = (
        Rule(LinkExtractor(allow ="http://www.designpriset.se/", restrict_xpaths=('//*[@class="html-winners"]')), callback='parse_item'),
    )

    def parse(self, response):
        for sel in response.xpath('//*[@class="entry-info"]'):
            item = ByrauItem()
            annons_list = sel.xpath('//span[@class="gold"]/text()|//span[@class="silver"]/text()').extract()
            byrau_list = sel.xpath('//div/text()').extract()
            kategori_list = sel.xpath('/preceding::h2/text()').extract()
            for x in range(0,len(annons_list)):
                item['Annonsrubrik'] = annons_list[x]
                item['Byrau'] = byrau_list[x]
                item['Kategori'] = kategori_list[x]
                yield item

    Annons'u List和Byrau'u List的工作非常完美,它们使用xpath从起点//*[@class="entry-info"]开始继承。但kategori_list给了我"indexerror:list index out of range"(索引错误:列表索引超出范围)。我写的xpath前面的axe是错误的吗?


    正如@kjhughes在comment中提到的,您需要在EDOCX1或EDOCX1之前添加EDOCX1,使您的xpath表达式相对于当前上下文元素。否则,表达式将被视为相对于根文档。这就是表达式EDOCX1没有返回任何内容的原因。

    对于EDOCX1,您还可以将其从xpath表达式的开头删除,作为使其相对于当前上下文元素的替代方法:

    ZZU1

    请注意,EDOCX1-5将返回位于EDOCX1-7之前的所有EDOCX1-6元素。根据发布的HTML,我认为下面的xpath表达式可以更安全地返回不需要的EDOCX1-6元素(误报):

    ZZU1