Python Scrapy XPath-Can';无法在范围内获取文本
我正在尝试访问网站上的地址信息。下面是我的代码示例:Python Scrapy XPath-Can';无法在范围内获取文本,python,xpath,web-scraping,scrapy,Python,Xpath,Web Scraping,Scrapy,我正在尝试访问网站上的地址信息。下面是我的代码示例: companytype_list = sel.xpath('''.//li[@class="type"]/p/text()''').extract() headquarters_list = sel.xpath('''.//li[@class="vcard hq"]/p/span[3]/text()''').extract() companysize_list = sel.xpath('''.//li[@class="company-size
companytype_list = sel.xpath('''.//li[@class="type"]/p/text()''').extract()
headquarters_list = sel.xpath('''.//li[@class="vcard hq"]/p/span[3]/text()''').extract()
companysize_list = sel.xpath('''.//li[@class="company-size"]/p/text()''').extract()
下面是一个如何在站点上格式化地址的示例:
<li class="type">
<h4>Type</h4>
<p>
Privately Held
</p>
</li>
<li class="vcard hq">
<h4>Headquarters</h4>
<p class="adr" itemprop="address" itemscope itemtype="http://schema.org/PostalAddress">
<span class="street-address" itemprop="streetAddress">Kornhamnstorg 49</span>
<span class="street-address" itemprop="streetAddress"></span>
<span class="locality" itemprop="addressLocality">Stockholm,</span>
<abbr class="region" title="Stockholm" itemprop="addressRegion">Stockholm</abbr>
<span class="postal-code" itemprop="postalCode">S-11127</span>
<span class="country-name" itemprop="addressCountry">Sweden</span>
</p>
</li>
<li class="company-size">
<h4>Company Size</h4>
<p>
11-50 employees
</p>
类型
私有企业
总部
Kornhamstorg 49
斯德哥尔摩,
斯德哥尔摩
S-11127
瑞典
公司规模
11-50名员工
但是当我运行scrapy脚本时,我得到了地址(vcard hq)的
索引器:列表索引超出范围。我试图重写代码以获取数据,但它不起作用。蜘蛛的其余部分工作正常。我遗漏了什么吗?你的例子很好。但是我猜您的xpath表达式在另一个页面或html部分失败了
问题在于在列表xpath表达式中使用索引(span[3]
)。使用您严重依赖的索引:
1。跨度元素的总数
2。关于跨度元素的确切顺序
通常,索引的使用会使xpath表达式更脆弱,更容易失败。因此,如果可能的话,我总是避免使用索引。在您的示例中,您实际上使用了地址信息的位置。span元素还可以通过其类名轻松引用,从而使表达式更加健壮:
//li[@class="vcard hq"]/p/span[@class='locality']/text()
根据您的问题描述,以下是我的测试代码:
# -*- coding: utf-8 -*-
from scrapy.selector import Selector
html_text = """
<li class="type">
<h4>Type</h4>
<p>
Privately Held
</p>
</li>
<li class="vcard hq">
<h4>Headquarters</h4>
<p class="adr" itemprop="address" itemscope itemtype="http://schema.org/PostalAddress">
<span class="street-address" itemprop="streetAddress">Kornhamnstorg 49</span>
<span class="street-address" itemprop="streetAddress"></span>
<span class="locality" itemprop="addressLocality">Stockholm,</span>
<abbr class="region" title="Stockholm" itemprop="addressRegion">Stockholm</abbr>
<span class="postal-code" itemprop="postalCode">S-11127</span>
<span class="country-name" itemprop="addressCountry">Sweden</span>
</p>
</li>
<li class="company-size">
<h4>Company Size</h4>
<p>
11-50 employees
</p>
"""
sel = Selector(text=html_text)
companytype_list = sel.xpath(
'''.//li[@class="type"]/p/text()''').extract()
headquarters_list = sel.xpath(
'''.//li[@class="vcard hq"]/p/span[3]/text()''').extract()
companysize_list = sel.xpath(
'''.//li[@class="company-size"]/p/text()''').extract()
#-*-编码:utf-8-*-
从scrapy.selector导入选择器
html_text=“”
类型
私有企业
总部
Kornhamstorg 49
斯德哥尔摩,
斯德哥尔摩
S-11127
瑞典
公司规模
11-50名员工
"""
sel=选择器(文本=html\U文本)
companytype_list=sel.xpath(
'.'.//li[@class=“type”]/p/text()'').extract()
总部列表=sel.xpath(
'.'.//li[@class=“vcard hq”]/p/span[3]/text()'').extract()
companysize_list=sel.xpath(
'.'.//li[@class=“company size”]/p/text()'').extract()
它不会引发任何异常。因此,可能存在结构不同的网页导致错误
在xpath规则中不直接使用索引是一种很好的做法。dron22的回答给出了一个令人敬畏的解释。不幸的是,这似乎不起作用。例如,我试过//span[@class='locality']/text()
和//li[@class=“vcard hq”]//text()
,但还是一无所获。我想这实际上可能不是xpath的问题,而是其他问题,因为有了这些xpath,我应该做对了?!好的,我在你对winiex回答的评论中看到你混淆了URL。所以我的解决方案适合你,对吗?谢谢你的回答,关于不同结构的页面,我目前只处理这个特定的页面。但它仍然不起作用。我想结论是这不是xpath问题?你知道它可能是什么吗?你能给我html字符串吗?在这种情况下会产生这些错误?那会有很大帮助哇,我刚刚意识到我在一个不同的页面上尝试了这个脚本。我正在做的那个没有地址。所以本质上你是对的,是一个不同的结构导致了错误。非常感谢你的帮助,很抱歉问了一个愚蠢的问题。