Python建议:编译包含关键字但仅包含唯一有效链接的URL列表

时间:2016-04-28 13:37:29

标签: python beautifulsoup

我还在学习Python的方法,所以我希望有人可以帮我解决这个问题并避免一些手动步骤。

我需要编译/创建表单列表

Institution, LinkToSpecificWebPage 

其中Link包含特定作品(对于此参数,可以说“store”)

我面临的问题是每个机构可以使用不同的表单或结构来访问我需要的WebPage的Web地址(有些使用store.institution.tld,其他的机构.tld / store 同样取决于机构使用的网络平台,它可能是完整的网址,也可能是像/ store这样的相对链接

我已经使用BS4返回包含“store”的所有链接并将其打印出来。

我的问题是如何建立一个列表,以便列出每个机构,并且每个机构都有一个完整的URL到他们的商店

是否有比if或www字符串的if语句和测试更优雅的方式?

找到的链接示例 代码输出机构名称,机构主页(来自较早的过程,然后从每个主页输出包含我感兴趣的文本的链接)。 我删除了一些副本,但是你可以在图像上有时会在页面上多次出现相同的链接,因此可能会有一个格式良好的完整链接返回,但不一定是第一个

InstName,HomePage.url,link.get('href')

Marino Institute http://www.mie.ie/ /Library.aspx
TCD http://www.tcd.ie/ /Library/
DIT http://www.dit.ie/ http://dit.ie/library/
IT Tallaght http://www.it-tallaght.ie/ libraryservice3
LYIT http://www.lyit.ie/#!prettyPhoto http://library1.lyit.ie/
DCU http://www.dcu.ie/ /library/index.shtml
NUIG http://www.nuigalway.ie/ //www.library.nuigalway.ie/

1 个答案:

答案 0 :(得分:1)

使用Python urlparse(请参阅documentation),您可以解析每个部分网址,然后将这些部分重新组合回一个网址。我做了以下假设,如果第3列中有一个域,则该url优先于第2列中的域。

from urlparse import urlsplit, urlunsplit

data = [["Marino Institute","http://www.mie.ie/","/Library.aspx"],
["TCD", "http://www.tcd.ie/", "/Library/"],
["DIT", "http://www.dit.ie/", "http://dit.ie/library/"],
["IT Tallaght", "http://www.it-tallaght.ie/", "libraryservice3"],
["LYIT", "http://www.lyit.ie/#!prettyPhoto", "http://library1.lyit.ie/"],
["DCU", "http://www.dcu.ie/", "/library/index.shtml"],
["NUIG", "http://www.nuigalway.ie/", "//www.library.nuigalway.ie/"]]


def merge_urls(partial_url1, partial_url2):

    o1 = urlsplit(partial_url1)
    o2 = urlsplit(partial_url2)

    # domain of o2 takes precedence over domain in o1
    if(o2.netloc != ''):
        o3 = o2
        o2 = o1
        o1 = o3

    schemes, netlocs, paths, queries, fragments = zip(o1, o2)
    scheme = schemes[0] if schemes[0] != '' else schemes[1]
    netloc = netlocs[0] if netlocs[0] != '' else netlocs[1]
    path = paths[0] if paths[0] != '/' else paths[1]
    query = queries[0] if queries[0] != '' else queries[1]
    fragment = fragments[0] if fragments[0] != '' else fragments[1]

    return urlunsplit((scheme, netloc, path, query, fragment))

for d in data:
    print d[0], merge_urls(d[1], d[2])

此输出,

Marino Institute http://www.mie.ie/Library.aspx
TCD http://www.tcd.ie/Library/
DIT http://dit.ie/library/
IT Tallaght http://www.it-tallaght.ie/libraryservice3
LYIT http://library1.lyit.ie/#!prettyPhoto
DCU http://www.dcu.ie/library/index.shtml
NUIG http://www.library.nuigalway.ie/