1
votes

Scrapy: Comment obtenir une adresse en utilisant CSS et XPath?

Comment obtenir une adresse en utilisant CSS et XPath? J'ai essayé d'utiliser 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>


1 commentaires

Essayez ceci address = '' .join ([i.strip () for i in response.css ('. Office-address span :: text'). Getall ()]) . Cela devrait également fonctionner dans le csv.


4 Réponses :


1
votes

Essayez ceci response.css ('. office-address :: text'). extract () Ajout d'espace avant ::text


1 commentaires

il fonctionne dans le scrapy shell, mais pas dans le csv yield {... 'Address': response.css ('. office-address :: text'). extract (), ...}



2
votes

Solution sale avec un XPath à une seule ligne:

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

Sortie:

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


1 commentaires

Ou encore plus simple string-join (// span // text (), '') .



0
votes

Option avec sélecteurs CSS avec scrapy:

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 = ", ".


0 commentaires

0
votes

Voici une idée à l'épreuve du temps puisque les identifiants / classes peuvent changer au cours de la période:

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

Résultat:

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 ) 


0 commentaires