搜索时网页抓取网址未更改

时间:2019-02-11 07:24:58

标签: python web-scraping

我正在尝试抓取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'])

3 个答案:

答案 0 :(得分:2)

使用requestsBeautifulSoup

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中进行选择。