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>
4 Réponses :
Essayez ceci response.css ('. office-address :: text'). extract ()
Ajout d'espace avant ::text
il fonctionne dans le scrapy shell, mais pas dans le csv yield {... 'Address': response.css ('. office-address :: text'). extract (), ...}
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())
Ou encore plus simple string-join (// span // text (), '')
.
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 = ", ".
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 )
Essayez ceci
address = '' .join ([i.strip () for i in response.css ('. Office-address span :: text'). Getall ()])
. Cela devrait également fonctionner dans le csv.