使用Python和BeautifulSoup解析多个URL

时间:2016-12-12 10:58:09

标签: python web-scraping beautifulsoup

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

我知道如何去做,即在循环中运行url,因为我知道url格式,但我不知道如何继续。我认为以某种方式搜索" next"会更好。按钮并运行该功能,如果没有,则停止功能。

我很感激能得到的任何帮助。

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

首先,你可以假设最大数量。目录的页面(如果你知道网址的模式)。我假设网址格式为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)