0

我試圖從網上語料庫中刮取。這些文本在網站上以樹狀方式排列:一次單擊A打開一個B頁面,在B中單擊一次C打開文本。在A中有大約50個鏈接,在B中,它在3到150之間變化,C中有時也有鏈接,但我對它們不感興趣。
這是我做到的:我打開了A,我用BeautifulSoup解析了它,收集了我想要的鏈接,並將它保存爲一個.txt文件。然後,我做了以下操作:python請求無效的模式錯誤

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] 

哪給了我想要從列表形式的頁面A的所有鏈接。 後來我寫了一個小腳本來測試我是否可以從列表Yeni_A_url_list的元素B中頁面的鏈接,這裏是我的腳本:

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")) 

帶鋼可能有有沒有作用,但我認爲它不會傷害。這個腳本對一個元素來說工作得很好。因此,我認爲,是時候寫一個函數來獲取所有的網頁B級在頁面A.因此,這裏的每一個環節的鏈接是我的函數:

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 

打印是那裏我看到了鏈接,已經由函數計算出來,並且睡眠在那裏不會使服務器過度充電,儘管由於某種原因time.sleep顯示語法錯誤。該功能也工作了列表的單個元素,這意味着以下工作:ListedenLinkAl(Yeni_A_url_list[1])

因此,我認爲,現在是時候該功能適用​​於列表Yeni_A_url_list的每一個元素,並做了一個列表理解:

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

我收到以下錯誤:

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]: 

我不知道爲什麼函數對於列表中的一個元素,但不能在列表理解。

回答

0

看起來像有周圍的網址中的額外字符,請使用str.strip()把它清理乾淨:

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

你的猜測是正確的,有一圈第一url一個額外字符,但str.strip()沒」 t解決了我的問題,而是跳過列表理解中的第一個url,並從第二個url開始列表。看來我的功能現在正在工作。 –