0

Ich versuche, von einem on-line-Korpus der Texte zu kratzen. Diese Texte sind auf der Site baumartig angeordnet: Ein Klick auf A öffnet eine B-Seite, in B klickt man auf C und öffnet den Text. In A gibt es ungefähr ~ 50 Links, in B variiert es zwischen 3 und ~ 150, es gibt auch Links in C, aber ich bin nicht an ihnen interessiert.
Hier ist, was ich getan habe, um dies zu erreichen: Ich öffnete das A, ich analysierte es mit BeautifulSoup, ich sammelte die Links, die ich wollte, und speicherte es als. TXT-Datei. Dann habe ich die folgenden:Python fordert ungültiges Schemafehler an

Url_List=[] 

with open("Aramaic_Url_List.txt", "r") as Url_List: 
    urls=Url_List.read() 

A_url_list=urls.splitlines() 
Yeni_A_url_list=[showsubtexts for showsubtexts in A_url_list if len(showsubtexts)>52] 

Was mich gab alle Links, die ich von Seite A in einer Listenform wollte. Dann habe ich ein kleines Skript geschrieben zu testen, ob ich Yeni_A_url_list die Links in B-Seite von einem Element der Liste erhalten, hier ist mein Skript:

data2=requests.get(Yeni_A_url_list[1].strip()) 
data2.raise_for_status() 
data2_Metin=data2.text 

soup_data2=BeautifulSoup(data2_Metin, "lxml") 

for link in soup_data2.find_all("a"): 
    print(link.get("href")) 

Der Streifen wahrscheinlich keine Funktion gibt, aber ich dachte, es würde nicht weh tun. Das Skript funktionierte ziemlich gut für ein Element. Also dachte ich, es Zeit ist, eine Funktion zu erhalten, alle Links in Seite B-Ebene für jeden Link in Seite A schreiben So, hier ist meine Funktion:

def ListedenLinkAl(h): 
    if h in Yeni_A_url_list: 
     print(h) 
    g=requests.get(h) 
    g.raise_for_status() 
    data_mtn=g.text 
    data_soup=BeautifulSoup(data_mtn,"lxml") 
    oP=[b.get("href") for b in data_soup.find_all("a")] 
    tk=list(set(oP)) 
    sleep(3) 
    return tk 

Druck ist für mich die Links zu sehen, dass wurden von der Funktion ausgearbeitet, und Schlaf ist da, um den Server nicht zu überlasten, obwohl time.sleep aus irgendeinem Grund einen Fehler in der Syntax enthüllte. Die Funktion arbeitete auch für ein einzelnes Element der Liste, die Bedeutung folgenden gearbeitet: ListedenLinkAl(Yeni_A_url_list[1])

Also dachte ich, es ist Zeit, um diese Funktion zu jedem Element der Liste Yeni_A_url_list und hat eine Liste Verständnis anzuwenden:

Temiz_url_Listesi=[ListedenLinkAl(x) for x in Yeni_A_url_list] 

Und ich erhielt den folgenden Fehler:

In [45]: Temiz_url_Listesi=[ListedenLinkAl(x) for x in Yeni_A_url_list] 
http://cal1.cn.huc.edu/showsubtexts.php?keyword=21200 
Traceback (most recent call last): 

    File "<ipython-input-45-8e4811c83c3f>", line 1, in <module> 
    Temiz_url_Listesi=[ListedenLinkAl(x) for x in Yeni_A_url_list] 

    File "<ipython-input-45-8e4811c83c3f>", line 1, in <listcomp> 
    Temiz_url_Listesi=[ListedenLinkAl(x) for x in Yeni_A_url_list] 

    File "<ipython-input-36-390e6ed1eae5>", line 6, in ListedenLinkAl 
    g=requests.get(h) 

    File "/home/dk/anaconda3/lib/python3.5/site-packages/requests/api.py", line 67, in get 
    return request('get', url, params=params, **kwargs) 

    File "/home/dk/anaconda3/lib/python3.5/site-packages/requests/api.py", line 53, in request 
    return session.request(method=method, url=url, **kwargs) 

    File "/home/dk/anaconda3/lib/python3.5/site-packages/requests/sessions.py", line 468, in request 
    resp = self.send(prep, **send_kwargs) 

    File "/home/dk/anaconda3/lib/python3.5/site-packages/requests/sessions.py", line 570, in send 
    adapter = self.get_adapter(url=request.url) 

    File "/home/dk/anaconda3/lib/python3.5/site-packages/requests/sessions.py", line 644, in get_adapter 
    raise InvalidSchema("No connection adapters were found for '%s'" % url) 

InvalidSchema: No connection adapters were found for 'http://cal1.cn.huc.edu/showsubtexts.php?keyword=21200' 

In [46]: 

ich habe keine Ahnung, warum die Funktion für ein einzelnes Element in der Liste funktioniert, aber nicht in der Liste Verständnis.

Antwort

0

Sieht aus wie es gibt zusätzliche Zeichen rund um die URL, verwenden str.strip() es aufzuräumen:

g = requests.get(h.strip()) 
+0

Ihre Vermutung richtig war, gab es ein zusätzliches Zeichen um das erste URL, aber str.strip() didn‘ Ich löste mein Problem, stattdessen übersprang ich die erste URL im Listenverständnis und startete die Liste von der zweiten URL aus. Es scheint, als ob meine Funktion jetzt funktioniert. –

Verwandte Themen