如何使用Python获取包含.ics文件的HTML href属性的URL?

时间:2017-07-10 16:34:58

标签: python html

我正在尝试从包含.ics日历的网页中获取.ics文件的网址。例如,https://meded.hms.harvard.edu/calendar,但它适用于包含.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文件的网址的更好方法是什么?

1 个答案:

答案 0 :(得分:2)

代码中的break将在一次迭代后停止脚本,您需要再次缩进,将其放入if(或使用return代替)。目前,无论for的结果是什么,它都会打破if

还有第二个问题是<a>个元素没有href属性,这会导致脚本在到达任何.ics链接之前失败:

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>

您可以通过在对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') 的链接来解决此问题。

固定代码:

source.on('addfeature', function(feature) {
        // do something with the feature 
    }, this);