我正在尝试抓取https://in.udacity.com/courses/all。输入搜索查询时,我需要获取显示的课程。例如:如果我输入python,结果将有17门课程。我只需要获取这些课程。在这里,搜索查询不会作为url的一部分传递。(不是get方法)。因此html内容也没有改变。然后,如何在不遍历整个课程列表的情况下获取这些结果。 在这段代码中,我正在获取所有课程链接,以获取其中的内容并搜索该内容中的搜索词。但是,这并没有给我期望的结果。
import requests
from bs4 import BeautifulSoup
from bs4 import BeautifulSoup
from bs4.element import Comment
import urllib.request
from urllib.request import Request, urlopen
def tag_visible(element):
if element.parent.name in ['style', 'script', 'head', 'title', 'meta', '[document]']:
return False
if isinstance(element, Comment):
return False
return True
def text_from_html(body):
soup = BeautifulSoup(body, 'html.parser')
texts = soup.findAll(text=True)
visible_texts = filter(tag_visible, texts)
return u" ".join(t.strip() for t in visible_texts)
page = requests.get("https://in.udacity.com/courses/all")
soup = BeautifulSoup(page.content, 'lxml')
courses = soup.select('a.capitalize')
search_term = input("enter the course:")
for link in courses:
#print("https://in.udacity.com" + link['href'])
html = urllib.request.urlopen("https://in.udacity.com" + link['href']).read()
if search_term in text_from_html(html).lower():
print('\n'+link.text)
print("https://in.udacity.com" + link['href'])
答案 0 :(得分:2)
import requests
from bs4 import BeautifulSoup
page = requests.get("https://in.udacity.com/courses/all")
soup = BeautifulSoup(page.content, 'html.parser')
courses = soup.find_all("a", class_="capitalize")
for course in courses:
print(course.text)
输出:
VR Foundations
VR Mobile 360
VR High-Immersion
Google Analytics
Artificial Intelligence for Trading
Python Foundation
.
.
.
编辑:
正如@Martin Evans所解释的那样,搜索背后的Ajax调用没有按照您的想法进行,它可能会保留搜索的数量,即有多少用户搜索了AI 正在根据search_term
中的关键字过滤搜索:
import requests
from bs4 import BeautifulSoup
import re
page = requests.get("https://in.udacity.com/courses/all")
soup = BeautifulSoup(page.content, 'html.parser')
courses = soup.find_all("a", class_="capitalize")
search_term = "AI"
for course in courses:
if re.search(search_term, course.text, re.IGNORECASE):
print(course.text)
输出:
AI Programming with Python
Blockchain Developer Nanodegree program
Knowledge-Based AI: Cognitive Systems
答案 1 :(得分:1)
当您请求时,udacity页面实际上将返回所有可用的课程。当您输入搜索内容时,页面只是在过滤可用数据。这就是为什么在输入搜索时看不到URL的任何更改的原因。使用浏览器的开发人员工具进行检查也可以确认这一点。这也解释了为什么“搜索”如此之快。
这样,如果您要搜索给定的课程,则只需要自己过滤结果即可。例如:
import requests
from bs4 import BeautifulSoup
req = requests.get("https://in.udacity.com/courses/all")
soup = BeautifulSoup(req.content, "html.parser")
a_tags = soup.find_all("a", class_="capitalize")
print("Number of courses:", len(a_tags))
print()
for a_tag in a_tags:
course = a_tag.text
if "python" in course.lower():
print(course)
这将显示所有标题为Python
的课程:
Number of courses: 225
Python Foundation
AI Programming with Python
Programming Foundations with Python
Data Structures & Algorithms in Python
答案 2 :(得分:0)
阅读有关如何使用requests(用于发出HTTP请求)和BeautifulSoup(用于处理HTML)的教程。这将教您下载页面以及从HTML中提取数据所需的知识。
您将使用函数BeautifulSoup.find_all()
通过<div>
在页面HTML中定位所有class=course-summary-card
元素。您想要的内容位于该<div>
中,并且在阅读了以上链接之后,您应该很容易就能找出其余的内容;)
顺便说一句,当您了解如何进行操作时,一个对您有用的工具将是使用“检查元素”功能(适用于Chrome / Firefox),可以通过右键单击浏览器中的元素来访问该功能,查看有关您要提取的元素的源代码,这样您就可以获得诸如class或id,parent divs之类的信息,这些信息使您可以在BeautifulSoup / lxml / etc中进行选择。