2016-04-01 17 views
0

Bu yüzden bir sitedeki heykelleri kazımak için aşağıdaki kodu kullanıyorum. Sorun, bazı bölümlerin eksik olmasıdır. Örneğin, bölüm 1 ila bölüm 2 için sayfalar vardır, daha sonra bölüm 3,4,5 için sayfa mevcut değildir. Kullanım aralığı (1,9) kullanıldığında, bana (0003/0003, 0004/0004, 0005/0005) URL'leri mevcut olmadığından bölüm 3,4,5 içeriklerini toplayamadığı için hatalar verir.BeautifulSoup kullanarak Python web kazıma, Loop ve belirli URL değerini atla

Döngüsümdeki eksik URL'leri nasıl atlayabilirim ve programın aralıktaki bir sonraki kullanılabilir URL'yi bulmasına nasıl izin verebilirim? Burada

bölüm 1'in url'dir: http://www.leg.state.fl.us/statutes/index.cfm?App_mode=Display_Statute&URL=0000-0099/0001/0001.html

cevap

2

Sen url isteği için bir try ekleyip kontrol edebilirsiniz tableContents is not none senin find_all uygulamadan önce:

import requests 

f = open('C:\Python27\projects\FL_final.doc','w') 

base_url = "http://www.leg.state.fl.us/statutes/index.cfm?App_mode=Display_Statute&URL=0000-0099/00{chapter:02d}/00{chapter:02d}.html" 

for chapter in range (1,9): 
    url = base_url.format(chapter=chapter) 
    try: 
    r = requests.get(url) 
    except requests.exceptions.RequestException as e: # This is the correct syntax 
     print "missing url" 
     print e 
     sys.exit(1) 
    soup = BeautifulSoup((r.content),"html.parser") 
    tableContents = soup.find('div', {'class': 'Chapters' }) 

    if tableContents is not None: 
    for title in tableContents.find_all ('div', {'class': 'Title' }): 
     f.write (title.text) 

    for data in tableContents.find_all('div',{'class':'Section' }): 
     data = data.text.encode("utf-8","ignore") 
     data = "\n\n" + str(data)+ "\n" 
     print data 
     f.write(data) 
+0

Hızlı yanıt için teşekkürler! kod çalışır! Bana tam olarak ne denemeyi/hariç tutmayı açıklar mısınız? Requestexception işlevi yapar? – CHballer

+1

Bu, Özel durumları işleme hakkında (daha fazlası için bkz. Https://docs.python.org/2/tutorial/errors.html#handling-exceptions). Ama sizin durumunuzda, konu "find_all" undefined 'tableContents' nesnesine (eksik bölümlere) uygulandı. – SLePort

0

Eğer tableContents bulunursa, örneğin kontrol edebilirsiniz:


    tableContents = soup.find('div', {'class': 'Chapters' }) 
    if tableContents: 
     for title in tableContents.find_all ('div', {'class': 'Title' }): 
      f.write (title.text)