2017-10-18 1 views
0

J'essaie d'utiliser urlparse.urljoin dans une araignée Scrapy pour compiler une liste d'URL à gratter. Actuellement, mon araignée ne retourne rien, mais ne jette aucune erreur. Donc j'essaie de vérifier que je compile les urls correctement.Scrapy - Est-ce que urlparse.urljoin se comporte de la même manière que str.join?

Ma tentative était de tester ce au ralenti en utilisant str.join, comme ci-dessous:

>>> href = ['lphs.asp?id=598&city=london', 
'lphs.asp?id=480&city=london', 
'lphs.asp?id=1808&city=london', 
'lphs.asp?id=1662&city=london', 
'lphs.asp?id=502&city=london',] 
>>> for x in href: 
    base = "http:/www.url-base.com/destination/" 
    final_url = str.join(base, x) 
    print(final_url) 

une ligne de ce qui retourne:

lhttp:/www.url-base.com/destination/phttp:/www.url-base.com/destination/hhttp:/www.url-base.com/destination/shttp:/www.url-base.com/destination/.http:/www.url-base.com/destination/ahttp:/www.url-base.com/destination/shttp:/www.url-base.com/destination/phttp:/www.url-base.com/destination/?http:/www.url-base.com/destination/ihttp:/www.url-base.com/destination/dhttp:/www.url-base.com/destination/=http:/www.url-base.com/destination/5http:/www.url-base.com/destination/9http:/www.url-base.com/destination/8http:/www.url-base.com/destination/&http:/www.url-base.com/destination/chttp:/www.url-base.com/destination/ihttp:/www.url-base.com/destination/thttp:/www.url-base.com/destination/yhttp:/www.url-base.com/destination/=http:/www.url-base.com/destination/lhttp:/www.url-base.com/destination/ohttp:/www.url-base.com/destination/nhttp:/www.url-base.com/destination/dhttp:/www.url-base.com/destination/ohttp:/www.url-base.com/destination/n

Je pense que de mon exemple, il est évident que str.join ne se comporte pas de la même manière - si c'est le cas, voilà pourquoi mon araignée ne suit pas ces liens! - Cependant, il serait bon d'avoir une confirmation à ce sujet.

Si ce n'est pas la bonne façon de tester, comment puis-je tester ce processus?

Mise à jour tentative à l'aide urlparse.urljoin ci-dessous: d'importation urllib.parse urlparse

>>> from urllib.parse import urlparse 
    >>> for x in href: 
     base = "http:/www.url-base.com/destination/" 
     final_url = urlparse.urljoin(base, x) 
     print(final_url) 

Ce qui jette AttributeError: 'function' object has no attribute 'urljoin'

Mise à jour - la fonction d'araignée en question

def parse_links(self, response): 
    room_links = response.xpath('//form/table/tr/td/table//a[div]/@href').extract() # insert xpath which contains the href for the rooms 
    for link in room_links: 
     base_url = "http://www.example.com/followthrough" 
     final_url = urlparse.urljoin(base_url, link) 
     print(final_url) 
     # This is not joing the final_url right 
     yield Request(final_url, callback=parse_links) 

Mise à jour

Je viens de tester à nouveau au ralenti:

>>> from urllib.parse import urljoin 
>>> from urllib import parse 
>>> room_links = ['lphs.asp?id=562&city=london', 
'lphs.asp?id=1706&city=london', 
'lphs.asp?id=1826&city=london', 
'lphs.asp?id=541&city=london', 
'lphs.asp?id=1672&city=london', 
'lphs.asp?id=509&city=london', 
'lphs.asp?id=428&city=london', 
'lphs.asp?id=614&city=london', 
'lphs.asp?id=336&city=london', 
'lphs.asp?id=412&city=london', 
'lphs.asp?id=611&city=london',] 
>>> for link in room_links: 
    base_url = "http:/www.url-base.com/destination/" 
    final_url = urlparse.urljoin(base_url, link) 
    print(final_url) 

qui a lancé ceci:

Traceback (most recent call last): 
    File "<pyshell#34>", line 3, in <module> 
    final_url = urlparse.urljoin(base_url, link) 
AttributeError: 'function' object has no attribute 'urljoin' 
+0

Si votre 'room_links' est montrant les choses bien et' base_url' est correctement défini, ça devrait être bien ... Que diriez-vous du reste de votre araignée ... Est-ce que 'parse_links' est appelé correctement et a-t-il vraiment besoin de rapporter avec lui-même? Si quoi que ce soit - s'il commence à crawler, il semble que ça va continuer à ramper et ne céder aucune donnée de toute façon. Avez-vous un 'start_requests' ou' start_urls' défini par exemple? –

+0

@JonClements L'URL de base est correctement définie, si je le prends et ajoute manuellement le href relatif cela fonctionne. J'utilise 'start_urls'rather que' start_requests'. Mais, je ne pense pas que la fonction fonctionne correctement - voir la mise à jour pour ce qui se passe quand je l'exécute en veille? – Maverick

Répondre

0

Vous voyez la sortie donnée à cause de cela:

for x in href: 
    base = "http:/www.url-base.com/destination/" 
    final_url = str.join(base, href) # <-- 'x' instead of 'href' probably intended here 
    print(final_url) 

urljoin du urllib bibliothèque se comporte différemment, il suffit de voir la documentation. Ce n'est pas une simple concaténation de chaînes.

EDIT: En fonction de votre commentaire, je suppose que vous utilisez Python 3. Avec cette déclaration d'importation, vous importez une fonction urlparse. C'est pourquoi vous obtenez cette erreur. Soit importer et à utiliser directement la fonction:

from urllib.parse import urljoin 
... 
final_url = urljoin(base, x) 

ou module d'importation parse et utilisez la fonction comme ceci:

from urllib import parse 
... 
final_url = parse.urljoin(base, x) 
+0

Oui, vous avez raison, je voulais dire 'x' là - Ont mis à jour la question et la sortie. Merci de confirmer ma suspicion, comment puis-je tester le 'urlparse.urljoin'- quand j'essaye d'exécuter ceci dans inactif je reçois' AttributeError: 'la fonction' l'objet n'a aucun attribut 'urljoin'' - je vais ajouter à la question . – Maverick

+0

A quoi ressemble votre 'import' et quelle version de Python utilisez-vous? Il y avait un changement entre Python 2 et 3 concernant la bibliothèque 'urllib'. –

+0

C'est '' par urllib.parse import urlparse'' – Maverick