使用Python和BeautifulSoup解析多个URL

使用Python和BeautifulSoup解析多个URL,python,web-scraping,beautifulsoup,Python,Web Scraping,Beautifulsoup,我从今天开始学习Python,所以我正在努力学习一些基础知识也就不足为奇了。我试图解析一个项目的学校网站上的数据,我设法解析了第一个页面。但是,有多个页面(结果分页) 我有一个关于如何去做的想法,也就是说,在一个循环中运行url,因为我知道url格式,但我不知道如何继续。我想最好是以某种方式搜索“下一步”按钮并运行函数(如果有),如果没有,则停止函数 如果能得到任何帮助,我将不胜感激 import requests from bs4 import BeautifulSoup url = "h

我从今天开始学习Python,所以我正在努力学习一些基础知识也就不足为奇了。我试图解析一个项目的学校网站上的数据,我设法解析了第一个页面。但是,有多个页面(结果分页)

我有一个关于如何去做的想法,也就是说,在一个循环中运行url,因为我知道url格式,但我不知道如何继续。我想最好是以某种方式搜索“下一步”按钮并运行函数(如果有),如果没有,则停止函数

如果能得到任何帮助,我将不胜感激

import requests
from  bs4 import BeautifulSoup

url = "http://www.myschoolwebsite.com/1" 
#url2 = "http://www.myschoolwebsite.com/2"
r = requests.get(url)

soup = BeautifulSoup(r.content,'lxml')
g_data = soup.find_all('ul', {"class": "searchResults"})

for item in g_data:
    for li in item.findAll('li'):
        for resultnameh2 in li.findAll('h2'):
            for resultname in resultnameh2.findAll('a'):
                print(resultname).text
    for resultAddress in li.findAll('p', {"class": "resultAddress"}):
        print(resultAddress).text.replace('Get directions','').strip()   
    for resultContact in li.findAll('ul', {"class": "resultContact"}):
        for resultContact in li.findAll('a', {"class": "resultMainNumber"}):
            print(resultContact).text

我会创建一个包含所有URL的数组,并在其中循环,或者如果有一个清晰的模式,则编写一个正则表达式来搜索该模式

首先,您可以假定目录的最大页数(如果您知道url的模式)。我假设url的格式为
http://base_url/page
接下来,您可以编写以下内容:

base_url = 'http://www.myschoolwebsite.com'
total_pages = 100

def parse_content(r):
    soup = BeautifulSoup(r.content,'lxml')
    g_data = soup.find_all('ul', {"class": "searchResults"})

    for item in g_data:
        for li in item.findAll('li'):
            for resultnameh2 in li.findAll('h2'):
                for resultname in resultnameh2.findAll('a'):
                    print(resultname).text
        for resultAddress in li.findAll('p', {"class": "resultAddress"}):
            print(resultAddress).text.replace('Get directions','').strip()   
        for resultContact in li.findAll('ul', {"class": "resultContact"}):
            for resultContact in li.findAll('a', {"class": "resultMainNumber"}):
                print(resultContact).text

for page in range(1, total_pages):
    response = requests.get(base_url + '/' + str(page))
    if response.status_code != 200:
        break

    parse_content(response)

谢谢我运行了代码,但出于某种原因,它现在只输出resultname.text,而忽略了所有其他字段。为什么会这样?这不应该发生。打印被点击页面的url,以便知道哪个页面只提供
resultname.text
。在浏览器中打开该url以查看是否存在这种情况。也许他们使用的html格式可能不同,或者可能没有数据,但当我使用我发布的代码时,它工作得很好。我不确定所有的页面都会出现什么问题?可能是网站有问题,我会设法解决。感谢您的帮助,非常感谢:)