source: cowsclient/trunk/cowsclient/lib/utils.py @ 6016

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/cowsclient/trunk/cowsclient/lib/utils.py@6016
Revision 6016, 2.5 KB checked in by pnorton, 12 years ago (diff)

Fixed a url join problem in the cows index parsing code.

Line 
1
2from cowsclient.lib.wmc_util import openURL
3
4import logging
5import urllib2 
6import urlparse
7import simplejson as json
8import libxml2dom
9
10log = logging.getLogger(__name__)
11
12def parseCowsCatalog(cowsEndpoint):
13    req = urllib2.Request(cowsEndpoint)
14    fh = openURL(req)
15    htmlString = fh.read()
16    fh.close()
17   
18    doc = libxml2dom.parseString(htmlString, html=1)
19   
20    COWSLinks = []
21   
22    for liElt in doc.getElementsByTagName("li"):
23   
24        childText = ""
25        links = {}
26   
27        for c in liElt.childNodes:
28   
29            # get the name by adding together all the text elements and then
30            # stripping whitespace and [].
31            if c.nodeType == 3:
32                childText += c.nodeValue
33   
34            # build a dictionary of the links with their ascociated text
35            elif c.nodeName == 'a' and c.hasAttribute('href'):
36                liknName = str(''.join(c.textContent.split())) # removing whitespace and converting from unicode
37               
38                href = c.getAttribute('href')
39                   
40                linkTarget =  urlparse.urljoin(cowsEndpoint, href)
41                links[liknName] = str(linkTarget)
42   
43        childText = ''.join(childText.split()) # strip the whitespace
44        childText = str(childText.replace('[]','')) # remove any angle brackets
45   
46        COWSLinks.append((childText, links))
47   
48    return COWSLinks
49
50def toJSON(obj):
51    return json.dumps(obj).replace('"', '\\"')
52
53def filterEnpointList(endpointList, requiredType, searchCowsIndex=True):
54        epList = []
55       
56        if endpointList is not None:
57            for e in endpointList:
58                if requiredType!= 'COWS' and e['service'] == 'COWS' and searchCowsIndex:
59                    try:
60                        for linkName, linkDict in parseCowsCatalog(e['url']):
61                            if requiredType in linkDict.keys():
62                                epList.append(
63                                    {'service':requiredType, 
64                                     'url':linkDict[requiredType], 
65                                     'name':linkName}
66                                )
67                    except:
68                        log.exception("An error occurred while reading cows catalog at %s"\
69                                      % (e['url'],))
70                           
71                elif e['service'] == requiredType:
72                    epList.append(e)
73               
74        return epList   
Note: See TracBrowser for help on using the repository browser.