【问题标题】:What is the most efficient way to get a specific link using Beautiful Soup in Python 3.0?在 Python 3.0 中使用 Beautiful Soup 获取特定链接的最有效方法是什么?
【发布时间】:2025-11-28 22:55:02
【问题描述】:

我目前正在 Coursera 上学习 Python 专业。我遇到了使用 BeautifulSoup 从网页中提取特定链接的问题。从这个网页 (http://py4e-data.dr-chuck.net/known_by_Fikret.html),我应该从用户输入中提取一个 URL 并打开后续链接,所有这些链接都通过锚选项卡标识并运行一些迭代。

虽然我可以使用列表对它们进行编程,但我想知道是否有更简单的方法可以在不使用列表或字典的情况下进行编程?

    html = urllib.request.urlopen(url, context=ctx).read()
    soup = BeautifulSoup(html, 'html.parser')
    tags = soup('a')
    nameList=list()
    loc=''
    count=0
    for tag in tags:
        loc=tag.get('href',None)
        nameList.append(loc)
    url=nameList[pos-1]

在上面的代码中,你会注意到在使用'a'标签和'href'定位链接之后,我不得不创建一个名为nameList的列表来定位链接的位置。由于这效率低下,我想知道是否可以在不使用列表的情况下直接定位 URL。提前致谢!

【问题讨论】:

    标签: python html beautifulsoup


    【解决方案1】:

    最简单的方法是从tags列表中取出一个元素,然后提取href值:

    tags = soup('a')
    a = tags[pos-1]
    loc = a.get('href', None)
    

    也可以使用soup.select_one()方法查询:nth-of-type元素:

    soup.select('a:nth-of-type({})'.format(pos))
    

    由于:nth-of-type 使用基于 1 的索引,因此如果您的用户也希望使用基于 1 的索引,则无需从 pos 值中减去 1


    注意,soup 的:nth-of-type 并不等同于 CSS :nth-of-type 伪类,因为它总是只选择一个元素,而 CSS 选择器可能一次选择多个元素。


    如果您正在寻找“最有效的方式”,那么您需要查看lxml

    from lxml.html import fromstring
    tree = fromstring(r.content)
    url = tree.xpath('(//a)[{}]/@href'.format(pos))[0]
    

    【讨论】:

    • @skovorodkin 谢谢!
    最近更新 更多