我正在尝试访问网站上的地址信息。这是我的代码示例:
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>
但是当我运行scrapy脚本时,我得到一个IndexError: list index out of range
的地址(vcard hq)。我试图重写代码来获取数据,但它不起作用。蜘蛛的其余部分工作得很好。我错过了什么吗?
答案 0 :(得分:2)
你的例子很好用。但我猜你的xpath表达式在另一个页面或html部分失败了。
问题是在Headquarters_list xpath表达式中使用索引(second date
)。使用索引严重依赖于:
<强> 1。 span元素的总数
<强> 2。关于span元素的确切顺序
通常,索引的使用往往会使xpath表达式更脆弱,更容易失败。因此,如果可能的话,我总是会避免使用索引。在您的示例中,您实际上采用了地址信息的位置。 span元素也可以通过其类名轻松引用,这使得表达式更加健壮:
span[3]
答案 1 :(得分:1)
根据您的问题描述,这是我的测试代码:
# -*- 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()
它不会引发任何异常。因此,存在导致错误的不同结构的网页的可能性很小。
在xpath规则中不直接使用索引是一种很好的做法。 dron22的回答给出了一个很棒的解释。