Scrapy XPath - 无法在span内获取文本

时间:2016-03-17 23:30:19

标签: 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"]/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)。我试图重写代码来获取数据,但它不起作用。蜘蛛的其余部分工作得很好。我错过了什么吗?

2 个答案:

答案 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的回答给出了一个很棒的解释。