如何使用 python 获取 HTML 中某个元素内的所有链接?

How do I grab all the links within an element in HTML using python?

首先,请查看下图,以便我更好地解释我的问题:

我正在尝试将用户输入 select 下面的链接之一 "Course Search By Term"...(即 2015 年冬季)。

打开的HTML显示了该网页的部分代码。我想抓取 element 中的所有 href 链接,它由我想要的五个术语链接组成。我按照这个网站 (www.gregreda.com/2013/03/03/web-scraping-101-with-python/) 的说明进行操作,但它没有解释这部分。这是我一直在尝试的一些代码。

from bs4 import BeautifulSoup
from urllib2 import urlopen

BASE_URL = "http://classes.uoregon.edu/"

def get_category_links(section_url):

    html = urlopen(section_url).read()
    soup = BeautifulSoup(html, "lxml")
    pldefault = soup.find("td", "pldefault")
    ul_links = pldefault.find("ul")
    category_links = [BASE_URL + ul.a["href"] for i in ul_links.findAll("ul")]

    return category_links

感谢任何帮助!谢谢。或者,如果您想查看该网站,其 classes.uoregon.edu/

我会保持简单,并在文本中找到包含 2015 并在 href 中包含 term 的所有链接:

for link in soup.find_all("a",
                          href=lambda href: href and "term" in href,
                          text=lambda text: text and "2015" in text):
    print link["href"]

打印:

/pls/prod/hwskdhnt.p_search?term=201402
/pls/prod/hwskdhnt.p_search?term=201403
/pls/prod/hwskdhnt.p_search?term=201404
/pls/prod/hwskdhnt.p_search?term=201406
/pls/prod/hwskdhnt.p_search?term=201407

如果您想要完整的 URL,请使用 urlparse.urljoin() 将链接与基础 url:

连接起来
from urlparse import urljoin

...
for link in soup.find_all("a",
                          href=lambda href: href and "term" in href,
                          text=lambda text: text and "2015" in text):
    print urljoin(url, link["href"])

这将打印:

http://classes.uoregon.edu/pls/prod/hwskdhnt.p_search?term=201402
http://classes.uoregon.edu/pls/prod/hwskdhnt.p_search?term=201403
http://classes.uoregon.edu/pls/prod/hwskdhnt.p_search?term=201404
http://classes.uoregon.edu/pls/prod/hwskdhnt.p_search?term=201406
http://classes.uoregon.edu/pls/prod/hwskdhnt.p_search?term=201407