首页 > 解决方案 > 通过 Beautiful Soup 的链接进行网页抓取

问题描述

我正在尝试抓取博客“ https://blog.feedspot.com/ai_rss_feeds/ ”并抓取其中的所有链接,以在每个抓取的链接中查找人工智能相关信息。

博客遵循一种模式——它有多个 RSS 提要,每个提要在 UI 中都有一个名为“站点”的属性。我需要获取“站点”属性中的所有链接。示例:aitrends.com、sciecedaily.com/...等。在代码中,主div有一个名为“rss-block”的类,它还有一个名为“data”的嵌套类,每个数据有几个

标签和

标签中有。href 中的值给出了要抓取的链接。我们需要在通过抓取上述结构找到的每个链接中查找与 AI 相关的文章。

我尝试了以下代码的各种变体,但似乎没有多大帮助。

import requests
from bs4 import BeautifulSoup

page = requests.get('https://blog.feedspot.com/ai_rss_feeds/')
soup = BeautifulSoup(page.text, 'html.parser')

class_name='data'

dataSoup = soup.find(class_=class_name)
print(dataSoup)
artist_name_list_items = dataSoup.find('a', href=True)
print(artist_name_list_items)

我什至很难获得该页面中的链接,更不用说通过这些链接中的每一个来抓取其中与 AI 相关的文章了。

如果你能帮助我完成问题的两个部分,那对我来说将是一个很好的学习。有关 HTML 结构,请参阅https://blog.feedspot.com/ai_rss_feeds/的来源。提前致谢!

标签: pythonweb-scrapingbeautifulsoup

解决方案


如您在页面上看到的,前 20 个结果存储在 html 中。其他是从脚本标签中提取的,您可以对它们进行正则表达式以创建 67 的完整列表。然后循环该列表并向那些发出请求以获取更多信息。我为初始列表填充提供了两种不同的选择器(第二个 - 被注释掉 - 使用:contains- 可用于 bs4 4.7.1+)

from bs4 import BeautifulSoup as bs
import requests, re

p = re.compile(r'feed_domain":"(.*?)",')

with requests.Session() as s:
    r = s.get('https://blog.feedspot.com/ai_rss_feeds/')
    soup = bs(r.content, 'lxml')
    results = [i['href'] for i in soup.select('.data [rel="noopener nofollow"]:last-child')]
    ## or use with bs4 4.7.1 + 
    #results = [i['href'] for i in soup.select('strong:contains(Site) + a')]
    results+= [re.sub(r'\n\s+','',i.replace('\\','')) for i in p.findall(r.text)]

    for link in results:
        #do something e.g.
        r = s.get(link)
        soup = bs(r.content, 'lxml')
        # extract info from indiv page

推荐阅读