【问题标题】:Scrapy: How to get address using CSS and XPath?Scrapy:如何使用 CSS 和 XPath 获取地址?
【发布时间】:2020-05-14 04:40:56
【问题描述】:

如何使用 CSS 和 XPath 获取地址?我尝试使用 CSS:response.css('.office-address::text').extract()

<span class="office-address" itemprop="address" itemscope="" itemtype="http://schema.org/PostalAddress">
                <span itemprop="streetAddress">
                    <span class="address-line1">5835 Post Rd.</span>

                        <span class="address-line2">Suite 217</span>
                </span>
                <span class="city-state-zip">
                    <span itemprop="addressLocality">East Greenwich</span>, <span itemprop="addressRegion">RI</span> <span itemprop="postalCode">02818</span>
                </span>
            </span>

【问题讨论】:

  • 试试这个address = ' '.join([i.strip() for i in response.css('.office-address span::text').getall()])。它也应该在 csv 中工作。

标签: python css xpath web-scraping scrapy


【解决方案1】:

使用单行 XPath 的肮脏解决方案:

concat(//span[@class='address-line1']/text(),' ',//span[@class='address-line2']/text(),' ',//span[@itemprop='addressLocality']/text(),', ',//span[@itemprop='addressRegion']/text(),//span[@itemprop='postalCode']/text())

输出:

"5835 Post Rd. Suite 217 East Greenwich, RI02818"

【讨论】:

  • 或者更简单的string-join(//span//text(),' ')
【解决方案2】:

试试这个response.css('.office-address ::text').extract()::text前面加空格

【讨论】:

  • 它可以在scrapy shell中工作,但不能在csv yield { ... 'Address': response.css('.office-address ::text').extract(), ... }
【解决方案3】:

带有scrapy的CSS选择器选项:

address = response.css("span.address-line1::text, span.address-line2::text, span[itemprop=addressLocality]::text, span[itemprop=addressRegion]::text, span[itemprop=postalCode]::text").extract() # should return list
if address:
    address = ", ".

【讨论】:

    【解决方案4】:

    这是一个面向未来的想法,因为 ids/classes 在此期间可能会发生变化:

    from re import sub
    from bs4 import BeautifulSoup as bs
    
    teststr = """<span class="office-address" itemprop="address" itemscope="" itemtype="http://schema.org/PostalAddress">
                    <span itemprop="streetAddress">
                        <span class="address-line1">5835 Post Rd.</span>
    
                            <span class="address-line2">Suite 217</span>
                    </span>
                    <span class="city-state-zip">
                        <span itemprop="addressLocality">East Greenwich</span>, <span itemprop="addressRegion">RI</span> <span itemprop="postalCode">02818</span>
                    </span>
                </span>"""
    
    r = bs(teststr,"lxml").getText().strip()
    r = sub( r"\n", ", ", r)
    r = sub( r"[, ]{2,}", ", ", r)
    print ( r ) 
    

    结果:

    5835 Post Rd., Suite 217, East Greenwich, RI 02818
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      • 2023-03-04
      • 2020-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多