2017-07-10 20 views
1

.icsカレンダーを含むウェブページの.icsファイルのURLを取得しようとしています。たとえば、https://meded.hms.harvard.edu/calendarですが、.icsを含むすべてのウェブページで有効です。私は間違ってHTML hrefのURLを取得する方法Pythonで.icsファイルを含む属性?

import urllib2 
import requests 
import bs4 

def get_ics_url(url): 

    #page = requests.get('https://meded.hms.harvard.edu/calendar').content 

    page = requests.get(url).content 
    soup = bs4.BeautifulSoup(page, 'lxml') 

    links = soup.find_all('a') 

    for link in links: 
     if link.get('href')[-4:]=='.ics': 
      endout = type(link.get('href')) 

      print endout 
     break 

何をやっている、と何.icsファイルのURLを取得するためのより良い方法がある:以下 は(何も印刷されないと、私はその理由を把握することはできません)私の素朴な試みであります私が探しているのは?

答えて

2

コード内のbreakは、1回の反復処理後にスクリプトを停止し、もう一度字下げしてifに配置するか、代わりにreturnを使用する必要があります。現在、ifの結果に関係なく、forが壊れます。例えば

if link.get('href')[-4:]=='.ics': 
TypeError: 'NoneType' object has no attribute '__getitem__' 

<a name="main-content"></a> 
<a class="cal-export" title="Note: Past events are not included">Export</a> 
それはどんなの.icsリンクに到達する前に

href属性を持たない<a>要素があるということである第二の問題あります、これは失敗したスクリプトが発生します

配列操作を行う前に、link.get('href') != Noneのリンクを確認して修正できます。

固定コード:

import urllib2 
import requests 
import bs4 

def get_ics_url(url): 
    page = requests.get(url).content 
    soup = bs4.BeautifulSoup(page, 'lxml') 

    links = soup.find_all('a') 

    for link in links: 
     if link.get('href') != None and link.get('href')[-4:]=='.ics': 
      endout = link.get('href') 
      return endout 

print get_ics_url('https://meded.hms.harvard.edu/calendar') 
+0

は偉大な、簡潔な答えをいただき、ありがとうございます。 –

関連する問題