我正在尝试抓取博客“https://blog.feedspot.com/ai_rss_feeds/”并抓取其中的所有链接,以在每个抓取的链接中查找人工智能相关信息。
博客遵循一种模式 - 它有多个 RSS Feed,每个 Feed 在 UI 中都有一个名为“站点”的属性。我需要获取“站点”属性中的所有链接。示例:aitrends.com、sciecedaily.com/...等。在代码中,主div有一个名为“rss-block”的类,该类还有另一个名为“data”的嵌套类,每个数据有多个
标签和
标签中有。 href 中的值给出了要爬行的链接。我们需要在通过抓取上述结构找到的每个链接中查找与人工智能相关的文章。
我尝试了以下代码的各种变体,但似乎没有多大帮助。
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 相关的文章了。
如果你能帮助我完成问题的两个部分,那对我来说将是一个很好的学习。来源请引用https://blog.feedspot.com/ai_rss_feeds/对于 HTML 结构。提前致谢!
最佳答案
前 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
关于python - 通过 Beautiful Soup 的链接进行网页抓取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57446218/