在 python BeautifulSoup 上获取带有特定前缀的超链接

Posted

技术标签:

【中文标题】在 python BeautifulSoup 上获取带有特定前缀的超链接【英文标题】:getting hyperlinks with a certain prefix on python BeautifulSoup 【发布时间】:2021-09-26 05:43:59 【问题描述】:

我试图创建一个函数来从一个链接到另一个***页面。链接到所有其他 wiki 文章都以前缀“/wiki/”开头。我尝试了一个代码来获取一个随机链接,但我的代码正在获取所有课程。之后在网上看到如下代码。

allLinks = soup.find(id="bodyContent").find_all("a")
    random.shuffle(allLinks)
    linkToScrape = 0

    for link in allLinks:
        # We are only interested in other wiki articles
        if link['href'].find("/wiki/") == -1:
            continue

        # Use this link to scrape
        linkToScrape = link
        break

此代码块似乎运行良好。但是,我无法理解一部分。

if link['href'].find("/wiki/") == -1:

我无法理解 -1 的用法。此外,有人可以解释这行代码中的条件是如何工作的,以及这里如何使用find 函数吗? 作为背景,这里是我找到代码的页面:“https://www.freecodecamp.org/news/scraping-wikipedia-articles-with-python/”

【问题讨论】:

您想要所有其他/wiki/ 链接还是非wiki 链接? 所有维基链接。 您希望我们做什么?我没有正确理解您的问题! 【参考方案1】:

如果在字符串s 中找不到子字符串subs.find(sub) 返回-1。所以在这种情况下,它是说“如果我们在链接字符串中找不到 /wiki/ 然后继续,因为它不是***链接”。

它之所以像-1 这样奇怪的数字是因为find 返回找到子字符串的索引,该索引可以是任何正数或0。所以-1 用于表示在任何索引处都找不到

https://docs.python.org/3/library/stdtypes.html#str.find

虽然在这种情况下,startswith 似乎更合适:

if not link['href'].starts("/wiki/"):
    continue

https://docs.python.org/3/library/stdtypes.html#str.startswith

【讨论】:

links = [i['href'] for i in soup.select("#bodyContent [href^='/wiki/']")] - 更好的是,只从一开始就收集符合条件的链接,然后去掉所有不必要的代码。 是的@QHarr,这将是一个更好的整体解决方案,我意识到他们的问题有两个方面:1.我如何找到这些链接? 2. 本例中的这一行是做什么的?

以上是关于在 python BeautifulSoup 上获取带有特定前缀的超链接的主要内容,如果未能解决你的问题,请参考以下文章

python安装BeautifulSoup注意事项

python爬虫之BeautifulSoup

python3.4 使用BeautifulSoup

在Python中导入BeautifulSoup时出错

python爬虫(十九)BeautifulSoup4库

Python beautifulsoup模块