在Python 3.0中使用Beautiful Soup获取特定链接的最有效方法是什么?

时间:2017-09-01 13:00:20

标签: python html beautifulsoup

我目前正在学习课程的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而不使用列表。提前致谢!

1 个答案:

答案 0 :(得分:3)

最简单的方法是从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的索引,则无需从1值中减去pos

请注意,汤的: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]