gpt4 book ai didi

python - 使用 Xpath 轴提取前面的元素

转载 作者:行者123 更新时间:2023-12-01 04:13:26 25 4
gpt4 key购买 nike

我正在尝试从具有以下结构的网站中抓取数据。我想提取每个 <li id="entry"> 中的信息,但这两个条目还应该从 <li id="category"> / <h2> 中提取类别信息

<ul class="html-winners">
<li id="category">
<h2>Redaktionell Print - Dagstidning</h2>
<ul>
<li id="entry">
<div class="entry-info">
<div class="block">
<img src="bilder/tumme10/4.jpg" width="110" height="147">
<span class="gold">Guld: Svenska Dagbladet</span><br>
<strong><strong>Designer:</strong></strong> Anna W Thurfjell och SvD:s medarbetare<br>
<strong><strong>Motivering:</strong></strong> "Konsekvent design som är lätt igenkänningsbar. Små förändringar förnyar ständigt och blldmotiven utnyttjas föredömligt."
</div>
</div>
</li>
<li id="entry">
<div class="entry-info">
<div class="block"><img src="bilder/tumme10/3.jpg" width="110" height="147">
<span class="silver">Silver: K2 - Kristianstadsbladet</span>
</div>
</div>
</li>
</ul>
</li>

我使用带有以下代码的scrapy:

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_list 和 byrau_list 工作得很好,他们使用 xpath 从起点 //*[@class="entry-info"] 沿着层次结构向下走。但 kategori_list 给了我“IndexError:列表索引超出范围”。我是否以错误的方式编写了 ax 之前的 xpath?

最佳答案

正如@kjhughes所述在评论中,您需要添加 .就在/之前或//使您的 XPath 表达式相对于当前上下文元素。否则,表达式将被视为相对于根文档。这就是为什么表达式 /preceding::h2/text()什么也没返回。

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

kategori_list = sel.xpath('preceding::h2/text()').extract()

请注意,preceding::h2将返回所有h2位于 <div class="entry-info"> 之前的元素。根据发布的 HTML,我认为以下 XPath 表达式更安全,不会返回不需要的 h2元素(误报):

query = 'parent::li/parent::ul/preceding-sibling::h2/text()'
kategori_list = sel.xpath(query).extract()

关于python - 使用 Xpath 轴提取前面的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34618085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com