Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Scrapy XPath-Can';无法在范围内获取文本_Python_Xpath_Web Scraping_Scrapy - Fatal编程技术网

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字符串吗?在这种情况下会产生这些错误?那会有很大帮助哇,我刚刚意识到我在一个不同的页面上尝试了这个脚本。我正在做的那个没有地址。所以本质上你是对的,是一个不同的结构导致了错误。非常感谢你的帮助,很抱歉问了一个愚蠢的问题。