10. Web Scraping#
import requests
from bs4 import BeautifulSoup
import pandas as pd
Warning
If it says it cannot load one of the libraries, use pip inside your notebook to install, then restart your kernel (Kernel menu, choose restart)
pip install beautifulsoup4
10.1. Getting Data From Websites#
We have seen that read_html
can get content from an actual website, not a data file that is hosted somewhere on the internet, that takes tables on a website and returns a list of DataFrames.
pd.read_html('https://rhodyprog4ds.github.io/BrownSpring23/syllabus/achievements.html')
Show code cell output
[ Unnamed: 0_level_0 topics
week Unnamed: 1_level_1
0 1 [admin, python review] \
1 2 Loading data, Python review
2 3 Exploratory Data Analysis
3 4 Data Cleaning
4 5 Databases, Merging DataFrames
5 6 Modeling, classification performance metrics, ...
6 7 Naive Bayes, decision trees
7 8 Regression
8 9 Clustering
9 10 SVM, parameter tuning
10 11 KNN, Model comparison
11 12 Text Analysis
12 13 Images Analysis
13 14 Deep Learning
skills
Unnamed: 2_level_1
0 process
1 [access, prepare, summarize]
2 [summarize, visualize]
3 [prepare, summarize, visualize]
4 [access, construct, summarize]
5 [evaluate]
6 [classification, evaluate]
7 [regression, evaluate]
8 [clustering, evaluate]
9 [optimize, tools]
10 [compare, tools]
11 [unstructured]
12 [unstructured, tools]
13 [tools, compare] ,
Unnamed: 0_level_0 skill
keyword Unnamed: 1_level_1
0 python pythonic code writing \
1 process describe data science as a process
2 access access data in multiple formats
3 construct construct datasets from multiple sources
4 summarize Summarize and describe data
5 visualize Visualize data
6 prepare prepare data for analysis
7 evaluate Evaluate model performance
8 classification Apply classification
9 regression Apply Regression
10 clustering Clustering
11 optimize Optimize model parameters
12 compare compare models
13 representation Choose representations and transform data
14 workflow use industry standard data science tools and w...
Level 1
Unnamed: 2_level_1
0 python code that mostly runs, occasional pep8 ... \
1 Identify basic components of data science
2 load data from at least one format; identify t...
3 identify what should happen to merge datasets ...
4 Describe the shape and structure of a dataset ...
5 identify plot types, generate basic plots from...
6 identify if data is or is not ready for analys...
7 Explain basic performance metrics for differen...
8 identify and describe what classification is, ...
9 identify what data that can be used for regres...
10 describe what clustering is
11 Identify when model parameters need to be opti...
12 Qualitatively compare model classes
13 Identify options for representing text and cat...
14 Solve well strucutred fully specified problems...
Level 2
Unnamed: 3_level_1
0 python code that reliably runs, frequent pep8 ... \
1 Describe and define each stage of the data sci...
2 Load data for processing from the most common ...
3 apply basic merges
4 compute summary statndard statistics of a whol...
5 generate multiple plot types with complete lab...
6 apply data reshaping, cleaning, and filtering ...
7 Apply and interpret basic model evaluation met...
8 fit, apply, and interpret preselected classifi...
9 fit and interpret linear regression models
10 apply basic clustering
11 Optimize basic model parameters such as model ...
12 Compare model classes in specific terms and fi...
13 Apply at least one representation to transform...
14 Solve well-strucutred, open-ended problems, ap...
Level 3
Unnamed: 4_level_1
0 reliable, efficient, pythonic code that consis...
1 Compare different ways that data science can f...
2 access data from both common and uncommon form...
3 merge data that is not automatically aligned
4 Compute and interpret various summary statisti...
5 generate complex plots with pandas and plottin...
6 apply data reshaping, cleaning, and filtering ...
7 Evaluate a model with multiple metrics and cro...
8 fit and apply classification models and select...
9 fit and explain regrularized or nonlinear regr...
10 apply multiple clustering techniques, and inte...
11 Select optimal parameters based of mutiple qua...
12 Evaluate tradeoffs between different model com...
13 apply transformations in different contexts OR...
14 Independently scope and solve realistic data s... ,
Unnamed: 0_level_0 A1 A2
keyword Unnamed: 1_level_1 Unnamed: 2_level_1
0 python 1 1 \
1 process 1 0
2 access 0 1
3 construct 0 0
4 summarize 0 0
5 visualize 0 0
6 prepare 0 0
7 evaluate 0 0
8 classification 0 0
9 regression 0 0
10 clustering 0 0
11 optimize 0 0
12 compare 0 0
13 representation 0 0
14 workflow 0 0
A3 A4 A5
Unnamed: 3_level_1 Unnamed: 4_level_1 Unnamed: 5_level_1
0 0 1 1 \
1 0 0 0
2 1 1 1
3 0 0 1
4 1 1 1
5 1 1 0
6 0 1 1
7 0 0 0
8 0 0 0
9 0 0 0
10 0 0 0
11 0 0 0
12 0 0 0
13 0 0 0
14 0 0 0
A6 A7 A8
Unnamed: 6_level_1 Unnamed: 7_level_1 Unnamed: 8_level_1
0 0 0 0 \
1 1 1 1
2 0 0 0
3 0 1 1
4 1 1 1
5 1 1 1
6 0 0 0
7 1 1 1
8 0 1 0
9 0 0 1
10 0 0 0
11 0 0 0
12 0 0 0
13 0 0 0
14 0 0 0
A9 A10 A11
Unnamed: 9_level_1 Unnamed: 10_level_1 Unnamed: 11_level_1
0 0 0 0 \
1 1 1 1
2 0 0 0
3 0 0 0
4 1 1 1
5 1 1 1
6 0 0 0
7 0 1 1
8 0 1 0
9 0 0 1
10 1 0 1
11 0 1 1
12 0 0 1
13 0 0 0
14 0 1 1
A12 A13 # Assignments
Unnamed: 12_level_1 Unnamed: 13_level_1 Unnamed: 14_level_1
0 0 0 4
1 0 0 7
2 0 0 4
3 0 0 3
4 1 1 11
5 1 1 10
6 0 0 2
7 0 0 5
8 0 0 2
9 0 0 2
10 0 0 2
11 0 0 2
12 0 1 2
13 1 1 2
14 1 1 4 ,
Unnamed: 0_level_0 Level 3
keyword Unnamed: 1_level_1
0 python reliable, efficient, pythonic code that consis... \
1 process Compare different ways that data science can f...
2 access access data from both common and uncommon form...
3 construct merge data that is not automatically aligned
4 summarize Compute and interpret various summary statisti...
5 visualize generate complex plots with pandas and plottin...
6 prepare apply data reshaping, cleaning, and filtering ...
7 evaluate Evaluate a model with multiple metrics and cro...
8 classification fit and apply classification models and select...
9 regression fit and explain regrularized or nonlinear regr...
10 clustering apply multiple clustering techniques, and inte...
11 optimize Select optimal parameters based of mutiple qua...
12 compare Evaluate tradeoffs between different model com...
13 representation apply transformations in different contexts OR...
14 workflow Independently scope and solve realistic data s...
P1 P2 P3 P4
Unnamed: 2_level_1 Unnamed: 3_level_1 Unnamed: 4_level_1 Unnamed: 5_level_1
0 1 1 0 1
1 0 1 1 1
2 1 1 0 1
3 1 1 0 1
4 1 1 0 1
5 1 1 0 1
6 1 1 0 1
7 0 1 1 1
8 0 1 1 1
9 0 1 1 1
10 0 1 1 1
11 0 0 1 1
12 0 0 1 1
13 0 0 1 1
14 0 0 1 1 ]
This gives us a list of DataFrames that come from the website. pandas
gets tables by looking in the html for the site and finding the <table>
tags.
10.2. Everything is Data#
For the purpose of this class, it is best to think of the content on a web page like a datastructure.
there are tags <>
that define the structure, and these can be further classified with classes
10.3. Scraping a URI website#
We’re going to create a DataFrame about URI CS & Statistics Faculty.
from the people page of the department website.
We can inspect the page to check that it’s well structured.
Warning
With great power comes great responsibility.
always check the robots.txt
do not do things that the owner says not to do
government websites are typically safe
We’ll save the URL for easy use
Then we can use the requests
library to make a call to the internet. It actually gets back a response object which has a lot of extra information. For today we only need the content
from the page which is an attrtibute of that object
cs_people_url = 'https://web.uri.edu/cs/people/'
cs_people_html = requests.get(cs_people_url).content
cs_people = BeautifulSoup(cs_people_html,'html.parser')
This is raw:
cs_people_html[:100]
b'\n<!DOCTYPE html>\n<html lang="en-US">\n\t\n<head>\n<meta charset="UTF-8"><script type="text/javascript">('
But we do not need to manually write search tools, that’s what BeautifulSoup
is for.
cs_people
Show code cell output
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8"/><script type="text/javascript">(window.NREUM||(NREUM={})).init={privacy:{cookies_enabled:true},ajax:{deny_list:["bam.nr-data.net"]},distributed_tracing:{enabled:true}};(window.NREUM||(NREUM={})).loader_config={agentID:"1103161638",accountID:"3574023",trustKey:"66686",xpid:"VwMAVVZRCxABVFBXAwUOV1EH",licenseKey:"NRJS-efb76a2da79a549a60d",applicationID:"1015449156"};;(()=>{var e,t,r={9071:(e,t,r)=>{"use strict";r.d(t,{I:()=>n});var n=0,i=navigator.userAgent.match(/Firefox[\/\s](\d+\.\d+)/);i&&(n=+i[1])},8768:(e,t,r)=>{"use strict";r.d(t,{T:()=>n,p:()=>i});const n=/(iPad|iPhone|iPod)/g.test(navigator.userAgent),i=n&&Boolean("undefined"==typeof SharedWorker)},27:(e,t,r)=>{"use strict";r.d(t,{P_:()=>g,Mt:()=>v,C5:()=>d,DL:()=>y,OP:()=>R,lF:()=>k,Yu:()=>E,Dg:()=>p,CX:()=>f,GE:()=>w,sU:()=>P});var n={};r.r(n),r.d(n,{agent:()=>A,match:()=>D,version:()=>x});var i=r(6797),o=r(909),a=r(8610);class s{constructor(e,t){try{if(!e||"object"!=typeof e)return(0,a.Z)("New setting a Configurable requires an object as input");if(!t||"object"!=typeof t)return(0,a.Z)("Setting a Configurable requires a model to set its initial properties");Object.assign(this,t),Object.entries(e).forEach((e=>{let[t,r]=e;const n=(0,o.q)(t);n.length&&r&&"object"==typeof r&&n.forEach((e=>{e in r&&((0,a.Z)('"'.concat(e,'" is a protected attribute and can not be changed in feature ').concat(t,". It will have no effect.")),delete r[e])})),this[t]=r}))}catch(e){(0,a.Z)("An error occured while setting a Configurable",e)}}}const c={beacon:i.ce.beacon,errorBeacon:i.ce.errorBeacon,licenseKey:void 0,applicationID:void 0,sa:void 0,queueTime:void 0,applicationTime:void 0,ttGuid:void 0,user:void 0,account:void 0,product:void 0,extra:void 0,jsAttributes:{},userAttributes:void 0,atts:void 0,transactionName:void 0,tNamePlain:void 0},u={};function d(e){if(!e)throw new Error("All info objects require an agent identifier!");if(!u[e])throw new Error("Info for ".concat(e," was never set"));return u[e]}function f(e,t){if(!e)throw new Error("All info objects require an agent identifier!");u[e]=new s(t,c),(0,i.Qy)(e,u[e],"info")}const l={allow_bfcache:!0,privacy:{cookies_enabled:!0},ajax:{deny_list:void 0,enabled:!0,harvestTimeSeconds:10},distributed_tracing:{enabled:void 0,exclude_newrelic_header:void 0,cors_use_newrelic_header:void 0,cors_use_tracecontext_headers:void 0,allowed_origins:void 0},ssl:void 0,obfuscate:void 0,jserrors:{enabled:!0,harvestTimeSeconds:10},metrics:{enabled:!0},page_action:{enabled:!0,harvestTimeSeconds:30},page_view_event:{enabled:!0},page_view_timing:{enabled:!0,harvestTimeSeconds:30,long_task:!1},session_trace:{enabled:!0,harvestTimeSeconds:10},spa:{enabled:!0,harvestTimeSeconds:10}},h={};function g(e){if(!e)throw new Error("All configuration objects require an agent identifier!");if(!h[e])throw new Error("Configuration for ".concat(e," was never set"));return h[e]}function p(e,t){if(!e)throw new Error("All configuration objects require an agent identifier!");h[e]=new s(t,l),(0,i.Qy)(e,h[e],"config")}function v(e,t){if(!e)throw new Error("All configuration objects require an agent identifier!");var r=g(e);if(r){for(var n=t.split("."),i=0;i<n.length-1;i++)if("object"!=typeof(r=r[n[i]]))return;r=r[n[n.length-1]]}return r}const m={accountID:void 0,trustKey:void 0,agentID:void 0,licenseKey:void 0,applicationID:void 0,xpid:void 0},b={};function y(e){if(!e)throw new Error("All loader-config objects require an agent identifier!");if(!b[e])throw new Error("LoaderConfig for ".concat(e," was never set"));return b[e]}function w(e,t){if(!e)throw new Error("All loader-config objects require an agent identifier!");b[e]=new s(t,m),(0,i.Qy)(e,b[e],"loader_config")}const E=(0,i.mF)().o;var A=null,x=null;const T=/Version\/(\S+)\s+Safari/;if(navigator.userAgent){var _=navigator.userAgent,S=_.match(T);S&&-1===_.indexOf("Chrome")&&-1===_.indexOf("Chromium")&&(A="Safari",x=S[1])}function D(e,t){if(!A)return!1;if(e!==A)return!1;if(!t)return!0;if(!x)return!1;for(var r=x.split("."),n=t.split("."),i=0;i<n.length;i++)if(n[i]!==r[i])return!1;return!0}var N=r(2400),O=r(2374),j=r(8226);const C=e=>({buildEnv:j.Re,bytesSent:{},customTransaction:void 0,disabled:!1,distMethod:j.gF,isolatedBacklog:!1,loaderType:void 0,maxBytes:3e4,offset:Math.floor(O._A?.performance?.timeOrigin||O._A?.performance?.timing?.navigationStart||Date.now()),onerror:void 0,origin:""+O._A.location,ptid:void 0,releaseIds:{},sessionId:1==v(e,"privacy.cookies_enabled")?(0,N.Bj)():null,xhrWrappable:"function"==typeof O._A.XMLHttpRequest?.prototype?.addEventListener,userAgent:n,version:j.q4}),I={};function R(e){if(!e)throw new Error("All runtime objects require an agent identifier!");if(!I[e])throw new Error("Runtime for ".concat(e," was never set"));return I[e]}function P(e,t){if(!e)throw new Error("All runtime objects require an agent identifier!");I[e]=new s(t,C(e)),(0,i.Qy)(e,I[e],"runtime")}function k(e){return function(e){try{const t=d(e);return!!t.licenseKey&&!!t.errorBeacon&&!!t.applicationID}catch(e){return!1}}(e)}},8226:(e,t,r)=>{"use strict";r.d(t,{Re:()=>i,gF:()=>o,q4:()=>n});const n="1.230.0",i="PROD",o="CDN"},9557:(e,t,r)=>{"use strict";r.d(t,{w:()=>o});var n=r(8610);const i={agentIdentifier:""};class o{constructor(e){try{if("object"!=typeof e)return(0,n.Z)("shared context requires an object as input");this.sharedContext={},Object.assign(this.sharedContext,i),Object.entries(e).forEach((e=>{let[t,r]=e;Object.keys(i).includes(t)&&(this.sharedContext[t]=r)}))}catch(e){(0,n.Z)("An error occured while setting SharedContext",e)}}}},4329:(e,t,r)=>{"use strict";r.d(t,{L:()=>d,R:()=>c});var n=r(3752),i=r(7022),o=r(4045),a=r(2325);const s={};function c(e,t){const r={staged:!1,priority:a.p[t]||0};u(e),s[e].get(t)||s[e].set(t,r)}function u(e){e&&(s[e]||(s[e]=new Map))}function d(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"feature";if(u(e),!e||!s[e].get(t))return a(t);s[e].get(t).staged=!0;const r=Array.from(s[e]);function a(t){const r=e?n.ee.get(e):n.ee,a=o.X.handlers;if(r.backlog&&a){var s=r.backlog[t],c=a[t];if(c){for(var u=0;s&&u<s.length;++u)f(s[u],c);(0,i.D)(c,(function(e,t){(0,i.D)(t,(function(t,r){r[0].on(e,r[1])}))}))}delete a[t],r.backlog[t]=null,r.emit("drain-"+t,[])}}r.every((e=>{let[t,r]=e;return r.staged}))&&(r.sort(((e,t)=>e[1].priority-t[1].priority)),r.forEach((e=>{let[t]=e;a(t)})))}function f(e,t){var r=e[1];(0,i.D)(t[r],(function(t,r){var n=e[0];if(r[0]===n){var i=r[1],o=e[3],a=e[2];i.apply(o,a)}}))}},3752:(e,t,r)=>{"use strict";r.d(t,{c:()=>f,ee:()=>u});var n=r(6797),i=r(3916),o=r(7022),a=r(27),s="nr@context";let c=(0,n.fP)();var u;function d(){}function f(e){return(0,i.X)(e,s,l)}function l(){return new d}function h(){u.aborted=!0,u.backlog={}}c.ee?u=c.ee:(u=function e(t,r){var n={},c={},f={},g=!1;try{g=16===r.length&&(0,a.OP)(r).isolatedBacklog}catch(e){}var p={on:b,addEventListener:b,removeEventListener:y,emit:m,get:E,listeners:w,context:v,buffer:A,abort:h,aborted:!1,isBuffering:x,debugId:r,backlog:g?{}:t&&"object"==typeof t.backlog?t.backlog:{}};return p;function v(e){return e&&e instanceof d?e:e?(0,i.X)(e,s,l):l()}function m(e,r,n,i,o){if(!1!==o&&(o=!0),!u.aborted||i){t&&o&&t.emit(e,r,n);for(var a=v(n),s=w(e),d=s.length,f=0;f<d;f++)s[f].apply(a,r);var l=T()[c[e]];return l&&l.push([p,e,r,a]),a}}function b(e,t){n[e]=w(e).concat(t)}function y(e,t){var r=n[e];if(r)for(var i=0;i<r.length;i++)r[i]===t&&r.splice(i,1)}function w(e){return n[e]||[]}function E(t){return f[t]=f[t]||e(p,t)}function A(e,t){var r=T();p.aborted||(0,o.D)(e,(function(e,n){t=t||"feature",c[n]=t,t in r||(r[t]=[])}))}function x(e){return!!T()[c[e]]}function T(){return p.backlog}}(void 0,"globalEE"),c.ee=u)},9252:(e,t,r)=>{"use strict";r.d(t,{E:()=>n,p:()=>i});var n=r(3752).ee.get("handle");function i(e,t,r,i,o){o?(o.buffer([e],i),o.emit(e,t,r)):(n.buffer([e],i),n.emit(e,t,r))}},4045:(e,t,r)=>{"use strict";r.d(t,{X:()=>o});var n=r(9252);o.on=a;var i=o.handlers={};function o(e,t,r,o){a(o||n.E,i,e,t,r)}function a(e,t,r,i,o){o||(o="feature"),e||(e=n.E);var a=t[o]=t[o]||{};(a[r]=a[r]||[]).push([e,i])}},8544:(e,t,r)=>{"use strict";r.d(t,{bP:()=>s,iz:()=>c,m$:()=>a});var n=r(2374);let i=!1,o=!1;try{const e={get passive(){return i=!0,!1},get signal(){return o=!0,!1}};n._A.addEventListener("test",null,e),n._A.removeEventListener("test",null,e)}catch(e){}function a(e,t){return i||o?{capture:!!e,passive:i,signal:t}:!!e}function s(e,t){let r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];window.addEventListener(e,t,a(r))}function c(e,t){let r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];document.addEventListener(e,t,a(r))}},5526:(e,t,r)=>{"use strict";r.d(t,{Ht:()=>a,M:()=>o,Rl:()=>i,ky:()=>s});var n=r(2374);function i(){var e=null,t=0,r=n._A?.crypto||n._A?.msCrypto;function i(){return e?15&e[t++]:16*Math.random()|0}r&&r.getRandomValues&&(e=r.getRandomValues(new Uint8Array(31)));for(var o,a="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx",s="",c=0;c<a.length;c++)s+="x"===(o=a[c])?i().toString(16):"y"===o?(o=3&i()|8).toString(16):o;return s}function o(){return s(16)}function a(){return s(32)}function s(e){var t=null,r=0,n=self.crypto||self.msCrypto;n&&n.getRandomValues&&Uint8Array&&(t=n.getRandomValues(new Uint8Array(31)));for(var i=[],o=0;o<e;o++)i.push(a().toString(16));return i.join("");function a(){return t?15&t[r++]:16*Math.random()|0}}},2053:(e,t,r)=>{"use strict";function n(){return Math.round(performance.now())}r.d(t,{z:()=>n})},6368:(e,t,r)=>{"use strict";r.d(t,{e:()=>o});var n=r(2374),i={};function o(e){if(e in i)return i[e];if(0===(e||"").indexOf("data:"))return{protocol:"data"};let t;var r=n._A?.location,o={};if(n.il)t=document.createElement("a"),t.href=e;else try{t=new URL(e,r.href)}catch(e){return o}o.port=t.port;var a=t.href.split("://");!o.port&&a[1]&&(o.port=a[1].split("/")[0].split("@").pop().split(":")[1]),o.port&&"0"!==o.port||(o.port="https"===a[0]?"443":"80"),o.hostname=t.hostname||r.hostname,o.pathname=t.pathname,o.protocol=a[0],"/"!==o.pathname.charAt(0)&&(o.pathname="/"+o.pathname);var s=!t.protocol||":"===t.protocol||t.protocol===r.protocol,c=t.hostname===r.hostname&&t.port===r.port;return o.sameOrigin=s&&(!t.hostname||c),"/"===o.pathname&&(i[e]=o),o}},8610:(e,t,r)=>{"use strict";function n(e,t){"function"==typeof console.warn&&(console.warn("New Relic: ".concat(e)),t&&console.warn(t))}r.d(t,{Z:()=>n})},3916:(e,t,r)=>{"use strict";r.d(t,{X:()=>i});var n=Object.prototype.hasOwnProperty;function i(e,t,r){if(n.call(e,t))return e[t];var i=r();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(e,t,{value:i,writable:!0,enumerable:!1}),i}catch(e){}return e[t]=i,i}},2374:(e,t,r)=>{"use strict";r.d(t,{_A:()=>o,il:()=>n,lW:()=>a,v6:()=>i});const n=Boolean("undefined"!=typeof window&&window.document),i=Boolean("undefined"!=typeof WorkerGlobalScope&&self.navigator instanceof WorkerNavigator);let o=(()=>{if(n)return window;if(i){if("undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope)return globalThis;if(self instanceof WorkerGlobalScope)return self}throw new Error('New Relic browser agent shutting down due to error: Unable to locate global scope. This is possibly due to code redefining browser global variables like "self" and "window".')})();function a(){return o}},7022:(e,t,r)=>{"use strict";r.d(t,{D:()=>n});const n=(e,t)=>Object.entries(e||{}).map((e=>{let[r,n]=e;return t(r,n)}))},2438:(e,t,r)=>{"use strict";r.d(t,{P:()=>o});var n=r(3752);const i=()=>{const e=new WeakSet;return(t,r)=>{if("object"==typeof r&&null!==r){if(e.has(r))return;e.add(r)}return r}};function o(e){try{return JSON.stringify(e,i())}catch(e){try{n.ee.emit("internal-error",[e])}catch(e){}}}},2650:(e,t,r)=>{"use strict";r.d(t,{K:()=>a,b:()=>o});var n=r(8544);function i(){return"undefined"==typeof document||"complete"===document.readyState}function o(e,t){if(i())return e();(0,n.bP)("load",e,t)}function a(e){if(i())return e();(0,n.iz)("DOMContentLoaded",e)}},6797:(e,t,r)=>{"use strict";r.d(t,{EZ:()=>u,Qy:()=>c,ce:()=>o,fP:()=>a,gG:()=>d,mF:()=>s});var n=r(2053),i=r(2374);const o={beacon:"bam.nr-data.net",errorBeacon:"bam.nr-data.net"};function a(){return i._A.NREUM||(i._A.NREUM={}),void 0===i._A.newrelic&&(i._A.newrelic=i._A.NREUM),i._A.NREUM}function s(){let e=a();return e.o||(e.o={ST:i._A.setTimeout,SI:i._A.setImmediate,CT:i._A.clearTimeout,XHR:i._A.XMLHttpRequest,REQ:i._A.Request,EV:i._A.Event,PR:i._A.Promise,MO:i._A.MutationObserver,FETCH:i._A.fetch}),e}function c(e,t,r){let i=a();const o=i.initializedAgents||{},s=o[e]||{};return Object.keys(s).length||(s.initializedAt={ms:(0,n.z)(),date:new Date}),i.initializedAgents={...o,[e]:{...s,[r]:t}},i}function u(e,t){a()[e]=t}function d(){return function(){let e=a();const t=e.info||{};e.info={beacon:o.beacon,errorBeacon:o.errorBeacon,...t}}(),function(){let e=a();const t=e.init||{};e.init={...t}}(),s(),function(){let e=a();const t=e.loader_config||{};e.loader_config={...t}}(),a()}},6998:(e,t,r)=>{"use strict";r.d(t,{N:()=>i});var n=r(8544);function i(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return void(0,n.iz)("visibilitychange",(function(){if(t){if("hidden"!=document.visibilityState)return;e()}e(document.visibilityState)}))}},2400:(e,t,r)=>{"use strict";r.d(t,{Bj:()=>c,GD:()=>s,J8:()=>u,ju:()=>o});var n=r(5526);const i="NRBA/";function o(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";try{return window.sessionStorage.setItem(i+r+e,t),!0}catch(e){return!1}}function a(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return window.sessionStorage.getItem(i+t+e)}function s(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";try{window.sessionStorage.removeItem(i+t+e)}catch(e){}}function c(){try{let e;return null===(e=a("SESSION_ID"))&&(e=(0,n.ky)(16),o("SESSION_ID",e)),e}catch(e){return null}}function u(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";const t=i+e,r={};try{for(let n=0;n<window.sessionStorage.length;n++){let i=window.sessionStorage.key(n);i.startsWith(t)&&(i=i.slice(t.length),r[i]=a(i,e))}}catch(e){}return r}},6408:(e,t,r)=>{"use strict";r.d(t,{W:()=>i});var n=r(2374);function i(){return"function"==typeof n._A?.PerformanceObserver}},8675:(e,t,r)=>{"use strict";r.d(t,{t:()=>n});const n=r(2325).D.ajax},8322:(e,t,r)=>{"use strict";r.d(t,{A:()=>i,t:()=>n});const n=r(2325).D.jserrors,i="nr@seenError"},6034:(e,t,r)=>{"use strict";r.d(t,{gF:()=>o,mY:()=>i,t9:()=>n,vz:()=>s,xS:()=>a});const n=r(2325).D.metrics,i="sm",o="cm",a="storeSupportabilityMetrics",s="storeEventMetrics"},6486:(e,t,r)=>{"use strict";r.d(t,{t:()=>n});const n=r(2325).D.pageAction},2484:(e,t,r)=>{"use strict";r.d(t,{Dz:()=>i,OJ:()=>a,qw:()=>o,t9:()=>n});const n=r(2325).D.pageViewEvent,i="firstbyte",o="domcontent",a="windowload"},6382:(e,t,r)=>{"use strict";r.d(t,{t:()=>n});const n=r(2325).D.pageViewTiming},2628:(e,t,r)=>{"use strict";r.r(t),r.d(t,{ADD_EVENT_LISTENER:()=>p,BST_RESOURCE:()=>a,BST_TIMER:()=>l,END:()=>u,FEATURE_NAME:()=>i,FN_END:()=>f,FN_START:()=>d,ORIG_EVENT:()=>g,PUSH_STATE:()=>h,RESOURCE:()=>s,RESOURCE_TIMING_BUFFER_FULL:()=>o,START:()=>c});var n=r(27);const i=r(2325).D.sessionTrace,o="resourcetimingbufferfull",a="bstResource",s="resource",c="-start",u="-end",d="fn"+c,f="fn"+u,l="bstTimer",h="pushState",g=n.Yu.EV,p="addEventListener"},755:(e,t,r)=>{"use strict";r.r(t),r.d(t,{BODY:()=>A,CB_END:()=>x,CB_START:()=>u,END:()=>E,FEATURE_NAME:()=>i,FETCH:()=>_,FETCH_BODY:()=>m,FETCH_DONE:()=>v,FETCH_START:()=>p,FN_END:()=>c,FN_START:()=>s,INTERACTION:()=>l,INTERACTION_API:()=>d,INTERACTION_EVENTS:()=>o,JSONP_END:()=>b,JSONP_NODE:()=>g,JS_TIME:()=>T,MAX_TIMER_BUDGET:()=>a,REMAINING:()=>f,SPA_NODE:()=>h,START:()=>w,originalSetTimeout:()=>y});var n=r(27);r(2374);const i=r(2325).D.spa,o=["click","submit","keypress","keydown","keyup","change"],a=999,s="fn-start",c="fn-end",u="cb-start",d="api-ixn-",f="remaining",l="interaction",h="spaNode",g="jsonpNode",p="fetch-start",v="fetch-done",m="fetch-body-",b="jsonp-end",y=n.Yu.ST,w="-start",E="-end",A="-body",x="cb"+E,T="jsTime",_="fetch"},1509:(e,t,r)=>{"use strict";r.d(t,{W:()=>s});var n=r(27),i=r(3752),o=r(2384),a=r(6797);class s{constructor(e,t,r){this.agentIdentifier=e,this.aggregator=t,this.ee=i.ee.get(e,(0,n.OP)(this.agentIdentifier).isolatedBacklog),this.featureName=r,this.blocked=!1,this.checkConfiguration()}checkConfiguration(){if(!(0,n.lF)(this.agentIdentifier)){let e={...(0,a.gG)().info?.jsAttributes};try{e={...e,...(0,n.C5)(this.agentIdentifier)?.jsAttributes}}catch(e){}(0,o.j)(this.agentIdentifier,{...(0,a.gG)(),info:{...(0,a.gG)().info,jsAttributes:e}})}}}},2384:(e,t,r)=>{"use strict";r.d(t,{j:()=>w});var n=r(2325),i=r(27),o=r(9252),a=r(3752),s=r(2053),c=r(4329),u=r(2650),d=r(2374),f=r(8610),l=r(6034),h=r(6797),g=r(2400);const p="CUSTOM/";function v(){const e=(0,h.gG)();["setErrorHandler","finished","addToTrace","inlineHit","addRelease","addPageAction","setCurrentRouteName","setPageViewName","setCustomAttribute","interaction","noticeError","setUserId"].forEach((t=>{e[t]=function(){for(var r=arguments.length,n=new Array(r),i=0;i<r;i++)n[i]=arguments[i];return function(t){for(var r=arguments.length,n=new Array(r>1?r-1:0),i=1;i<r;i++)n[i-1]=arguments[i];let o=[];return Object.values(e.initializedAgents).forEach((e=>{e.exposed&&e.api[t]&&o.push(e.api[t](...n))})),o.length>1?returnsVals:o[0]}(t,...n)}}))}var m=r(7022);const b={stn:[n.D.sessionTrace],err:[n.D.jserrors,n.D.metrics],ins:[n.D.pageAction],spa:[n.D.spa]};const y={};function w(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},w=arguments.length>2?arguments[2]:void 0,E=arguments.length>3?arguments[3]:void 0,{init:A,info:x,loader_config:T,runtime:_={loaderType:w},exposed:S=!0}=t;const D=(0,h.gG)();if(x||(A=D.init,x=D.info,T=D.loader_config),x.jsAttributes??={},d.v6&&(x.jsAttributes.isWorker=!0),d.il){let e=(0,g.J8)(p);Object.assign(x.jsAttributes,e)}(0,i.CX)(e,x),(0,i.Dg)(e,A||{}),(0,i.GE)(e,T||{}),(0,i.sU)(e,_),v();const N=function(e,t){t||(0,c.R)(e,"api");const h={};var v=a.ee.get(e),m=v.get("tracer"),b="api-",y=b+"ixn-";function w(t,r,n,o){const a=(0,i.C5)(e);return null===r?(delete a.jsAttributes[t],d.il&&(0,g.GD)(t,p)):((0,i.CX)(e,{...a,jsAttributes:{...a.jsAttributes,[t]:r}}),d.il&&o&&(0,g.ju)(t,r,p)),x(b,n,!0)()}function E(){}["setErrorHandler","finished","addToTrace","inlineHit","addRelease"].forEach((e=>h[e]=x(b,e,!0,"api"))),h.addPageAction=x(b,"addPageAction",!0,n.D.pageAction),h.setCurrentRouteName=x(b,"routeName",!0,n.D.spa),h.setPageViewName=function(t,r){if("string"==typeof t)return"/"!==t.charAt(0)&&(t="/"+t),(0,i.OP)(e).customTransaction=(r||"http://custom.transaction")+t,x(b,"setPageViewName",!0)()},h.setCustomAttribute=function(e,t){let r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if("string"==typeof e){if(["string","number"].includes(typeof t)||null===t)return w(e,t,"setCustomAttribute",r);(0,f.Z)("Failed to execute setCustomAttribute.\nNon-null value must be a string or number type, but a type of <".concat(typeof t,"> was provided."))}else(0,f.Z)("Failed to execute setCustomAttribute.\nName must be a string type, but a type of <".concat(typeof e,"> was provided."))},h.setUserId=function(e){if("string"==typeof e||null===e)return w("enduser.id",e,"setUserId",!0);(0,f.Z)("Failed to execute setUserId.\nNon-null value must be a string type, but a type of <".concat(typeof e,"> was provided."))},h.interaction=function(){return(new E).get()};var A=E.prototype={createTracer:function(e,t){var r={},i=this,a="function"==typeof t;return(0,o.p)(y+"tracer",[(0,s.z)(),e,r],i,n.D.spa,v),function(){if(m.emit((a?"":"no-")+"fn-start",[(0,s.z)(),i,a],r),a)try{return t.apply(this,arguments)}catch(e){throw m.emit("fn-err",[arguments,this,"string"==typeof e?new Error(e):e],r),e}finally{m.emit("fn-end",[(0,s.z)()],r)}}}};function x(e,t,r,i){return function(){return(0,o.p)(l.xS,["API/"+t+"/called"],void 0,n.D.metrics,v),i&&(0,o.p)(e+t,[(0,s.z)(),...arguments],r?null:this,i,v),r?void 0:this}}function T(){r.e(439).then(r.bind(r,5692)).then((t=>{let{setAPI:r}=t;r(e),(0,c.L)(e,"api")})).catch((()=>(0,f.Z)("Downloading runtime APIs failed...")))}return["actionText","setName","setAttribute","save","ignore","onEnd","getContext","end","get"].forEach((e=>{A[e]=x(y,e,void 0,n.D.spa)})),h.noticeError=function(e,t){"string"==typeof e&&(e=new Error(e)),(0,o.p)(l.xS,["API/noticeError/called"],void 0,n.D.metrics,v),(0,o.p)("err",[e,(0,s.z)(),!1,t],void 0,n.D.jserrors,v)},d.v6?T():(0,u.b)((()=>T()),!0),h}(e,E);return(0,h.Qy)(e,N,"api"),(0,h.Qy)(e,S,"exposed"),(0,h.EZ)("activatedFeatures",y),(0,h.EZ)("setToken",(t=>function(e,t){var r=a.ee.get(t);e&&"object"==typeof e&&((0,m.D)(e,(function(e,t){if(!t)return(b[e]||[]).forEach((t=>{(0,o.p)("block-"+e,[],void 0,t,r)}));y[e]||((0,o.p)("feat-"+e,[],void 0,b[e],r),y[e]=!0)})),(0,c.L)(t,n.D.pageViewEvent))}(t,e))),N}},909:(e,t,r)=>{"use strict";r.d(t,{Z:()=>i,q:()=>o});var n=r(2325);function i(e){switch(e){case n.D.ajax:return[n.D.jserrors];case n.D.sessionTrace:return[n.D.ajax,n.D.pageViewEvent];case n.D.pageViewTiming:return[n.D.pageViewEvent];default:return[]}}function o(e){return e===n.D.jserrors?[]:["auto"]}},2325:(e,t,r)=>{"use strict";r.d(t,{D:()=>n,p:()=>i});const n={ajax:"ajax",jserrors:"jserrors",metrics:"metrics",pageAction:"page_action",pageViewEvent:"page_view_event",pageViewTiming:"page_view_timing",sessionTrace:"session_trace",spa:"spa"},i={[n.pageViewEvent]:1,[n.pageViewTiming]:2,[n.metrics]:3,[n.jserrors]:4,[n.ajax]:5,[n.sessionTrace]:6,[n.pageAction]:7,[n.spa]:8}},8683:e=>{e.exports=function(e,t,r){t||(t=0),void 0===r&&(r=e?e.length:0);for(var n=-1,i=r-t||0,o=Array(i<0?0:i);++n<i;)o[n]=e[t+n];return o}}},n={};function i(e){var t=n[e];if(void 0!==t)return t.exports;var o=n[e]={exports:{}};return r[e](o,o.exports,i),o.exports}i.m=r,i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.f={},i.e=e=>Promise.all(Object.keys(i.f).reduce(((t,r)=>(i.f[r](e,t),t)),[])),i.u=e=>(({78:"page_action-aggregate",147:"metrics-aggregate",193:"session_trace-aggregate",317:"jserrors-aggregate",348:"page_view_timing-aggregate",439:"async-api",729:"lazy-loader",786:"page_view_event-aggregate",873:"spa-aggregate",898:"ajax-aggregate"}[e]||e)+"."+{78:"4d79b951",147:"20a08804",193:"6e2218bf",317:"9136a849",348:"9590bdab",439:"6c072bf7",729:"ff971c03",786:"75812140",862:"9f44b58b",873:"6c038a0a",898:"bcd562bf"}[e]+"-1.230.0.min.js"),i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),e={},t="NRBA:",i.l=(r,n,o,a)=>{if(e[r])e[r].push(n);else{var s,c;if(void 0!==o)for(var u=document.getElementsByTagName("script"),d=0;d<u.length;d++){var f=u[d];if(f.getAttribute("src")==r||f.getAttribute("data-webpack")==t+o){s=f;break}}s||(c=!0,(s=document.createElement("script")).charset="utf-8",s.timeout=120,i.nc&&s.setAttribute("nonce",i.nc),s.setAttribute("data-webpack",t+o),s.src=r),e[r]=[n];var l=(t,n)=>{s.onerror=s.onload=null,clearTimeout(h);var i=e[r];if(delete e[r],s.parentNode&&s.parentNode.removeChild(s),i&&i.forEach((e=>e(n))),t)return t(n)},h=setTimeout(l.bind(null,void 0,{type:"timeout",target:s}),12e4);s.onerror=l.bind(null,s.onerror),s.onload=l.bind(null,s.onload),c&&document.head.appendChild(s)}},i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.p="https://js-agent.newrelic.com/",(()=>{var e={438:0,14:0};i.f.j=(t,r)=>{var n=i.o(e,t)?e[t]:void 0;if(0!==n)if(n)r.push(n[2]);else{var o=new Promise(((r,i)=>n=e[t]=[r,i]));r.push(n[2]=o);var a=i.p+i.u(t),s=new Error;i.l(a,(r=>{if(i.o(e,t)&&(0!==(n=e[t])&&(e[t]=void 0),n)){var o=r&&("load"===r.type?"missing":r.type),a=r&&r.target&&r.target.src;s.message="Loading chunk "+t+" failed.\n("+o+": "+a+")",s.name="ChunkLoadError",s.type=o,s.request=a,n[1](s)}}),"chunk-"+t,t)}};var t=(t,r)=>{var n,o,[a,s,c]=r,u=0;if(a.some((t=>0!==e[t]))){for(n in s)i.o(s,n)&&(i.m[n]=s[n]);if(c)c(i)}for(t&&t(r);u<a.length;u++)o=a[u],i.o(e,o)&&e[o]&&e[o][0](),e[o]=0},r=window.webpackChunkNRBA=window.webpackChunkNRBA||[];r.forEach(t.bind(null,0)),r.push=t.bind(null,r.push.bind(r))})();var o={};(()=>{"use strict";i.r(o);var e=i(2325),t=i(27);const r=Object.values(e.D);function n(e){const n={};return r.forEach((r=>{n[r]=function(e,r){return!1!==(0,t.Mt)(r,"".concat(e,".enabled"))}(r,e)})),n}var a=i(2384),s=i(909),c=i(9252),u=i(8768),d=i(4329),f=i(1509),l=i(2650),h=i(2374),g=i(8610);class p extends f.W{constructor(e,t,r){let n=!(arguments.length>3&&void 0!==arguments[3])||arguments[3];super(e,t,r),this.hasAggregator=!1,this.auto=n,this.abortHandler,n&&(0,d.R)(e,r)}importAggregator(){if(this.hasAggregator||!this.auto)return;this.hasAggregator=!0;const e=async()=>{try{const{lazyLoader:e}=await i.e(729).then(i.bind(i,8110)),{Aggregate:t}=await e(this.featureName,"aggregate");new t(this.agentIdentifier,this.aggregator)}catch(e){(0,g.Z)("Downloading ".concat(this.featureName," failed...")),this.abortHandler?.()}};h.v6?e():(0,l.b)((()=>e()),!0)}}var v=i(2484),m=i(2053);class b extends p{static featureName=v.t9;constructor(r,n){let i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(super(r,n,v.t9,i),("undefined"==typeof PerformanceNavigationTiming||u.T)&&"undefined"!=typeof PerformanceTiming){const n=(0,t.OP)(r);n[v.Dz]=Math.max(Date.now()-n.offset,0),(0,l.K)((()=>n[v.qw]=Math.max((0,m.z)()-n[v.Dz],0))),(0,l.b)((()=>{const t=(0,m.z)();n[v.OJ]=Math.max(t-n[v.Dz],0),(0,c.p)("timing",["load",t],void 0,e.D.pageViewTiming,this.ee)}))}this.importAggregator()}}var y=i(9557),w=i(7022);class E extends y.w{constructor(e){super(e),this.aggregatedData={}}store(e,t,r,n,i){var o=this.getBucket(e,t,r,i);return o.metrics=function(e,t){t||(t={count:0});return t.count+=1,(0,w.D)(e,(function(e,r){t[e]=A(r,t[e])})),t}(n,o.metrics),o}merge(e,t,r,n,i){var o=this.getBucket(e,t,n,i);if(o.metrics){var a=o.metrics;a.count+=r.count,(0,w.D)(r,(function(e,t){if("count"!==e){var n=a[e],i=r[e];i&&!i.c?a[e]=A(i.t,n):a[e]=function(e,t){if(!t)return e;t.c||(t=x(t.t));return t.min=Math.min(e.min,t.min),t.max=Math.max(e.max,t.max),t.t+=e.t,t.sos+=e.sos,t.c+=e.c,t}(i,a[e])}}))}else o.metrics=r}storeMetric(e,t,r,n){var i=this.getBucket(e,t,r);return i.stats=A(n,i.stats),i}getBucket(e,t,r,n){this.aggregatedData[e]||(this.aggregatedData[e]={});var i=this.aggregatedData[e][t];return i||(i=this.aggregatedData[e][t]={params:r||{}},n&&(i.custom=n)),i}get(e,t){return t?this.aggregatedData[e]&&this.aggregatedData[e][t]:this.aggregatedData[e]}take(e){for(var t={},r="",n=!1,i=0;i<e.length;i++)t[r=e[i]]=T(this.aggregatedData[r]),t[r].length&&(n=!0),delete this.aggregatedData[r];return n?t:null}}function A(e,t){return null==e?function(e){e?e.c++:e={c:1};return e}(t):t?(t.c||(t=x(t.t)),t.c+=1,t.t+=e,t.sos+=e*e,e>t.max&&(t.max=e),e<t.min&&(t.min=e),t):{t:e}}function x(e){return{t:e,min:e,max:e,sos:e*e,c:1}}function T(e){return"object"!=typeof e?[]:(0,w.D)(e,_)}function _(e,t){return t}var S=i(6797),D=i(5526),N=i(2438);var O=i(6998),j=i(8544),C=i(6382);class I extends p{static featureName=C.t;constructor(e,r){let n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];super(e,r,C.t,n),h.il&&((0,t.OP)(e).initHidden=Boolean("hidden"===document.visibilityState),(0,O.N)((()=>(0,c.p)("docHidden",[(0,m.z)()],void 0,C.t,this.ee)),!0),(0,j.bP)("pagehide",(()=>(0,c.p)("winPagehide",[(0,m.z)()],void 0,C.t,this.ee))),this.importAggregator())}}const R=Boolean(h._A?.Worker),P=Boolean(h._A?.SharedWorker),k=Boolean(h._A?.navigator?.serviceWorker);let H,L,z;var M=i(6034),B=i(3752),F=i(8683),U=i.n(F);const q="nr@original";var W=Object.prototype.hasOwnProperty,G=!1;function V(e,t){return e||(e=B.ee),r.inPlace=function(e,t,n,i,o){n||(n="");var a,s,c,u="-"===n.charAt(0);for(c=0;c<t.length;c++)$(a=e[s=t[c]])||(e[s]=r(a,u?s+n:n,i,s,o))},r.flag=q,r;function r(t,r,i,o,a){return $(t)?t:(r||(r=""),nrWrapper[q]=t,Z(t,nrWrapper,e),nrWrapper);function nrWrapper(){var s,c,u,d;try{c=this,s=U()(arguments),u="function"==typeof i?i(s,c):i||{}}catch(t){X([t,"",[s,c,o],u],e)}n(r+"start",[s,c,o],u,a);try{return d=t.apply(c,s)}catch(e){throw n(r+"err",[s,c,e],u,a),e}finally{n(r+"end",[s,c,d],u,a)}}}function n(r,n,i,o){if(!G||t){var a=G;G=!0;try{e.emit(r,n,i,t,o)}catch(t){X([t,r,n,i],e)}G=a}}}function X(e,t){t||(t=B.ee);try{t.emit("internal-error",e)}catch(e){}}function Z(e,t,r){if(Object.defineProperty&&Object.keys)try{return Object.keys(e).forEach((function(r){Object.defineProperty(t,r,{get:function(){return e[r]},set:function(t){return e[r]=t,t}})})),t}catch(e){X([e],r)}for(var n in e)W.call(e,n)&&(t[n]=e[n]);return t}function $(e){return!(e&&e instanceof Function&&e.apply&&!e[q])}const Y={},Q=["debug","error","info","log","trace","warn"];function J(e){const t=function(e){return(e||B.ee).get("console")}(e);return Y[t.debugId]||(Y[t.debugId]=!0,V(t).inPlace(h._A.console,Q,"-console-")),t}var K=i(3916);const ee={},te=XMLHttpRequest,re="addEventListener",ne="removeEventListener";function ie(e){var t=function(e){return(e||B.ee).get("events")}(e);if(ee[t.debugId]++)return t;ee[t.debugId]=1;var r=V(t,!0);function n(e){r.inPlace(e,[re,ne],"-",i)}function i(e,t){return e[1]}return"getPrototypeOf"in Object&&(h.il&&oe(document,n),oe(h._A,n),oe(te.prototype,n)),t.on(re+"-start",(function(e,t){var n=e[1];if(null!==n&&("function"==typeof n||"object"==typeof n)){var i=(0,K.X)(n,"nr@wrapped",(function(){var e={object:function(){if("function"!=typeof n.handleEvent)return;return n.handleEvent.apply(n,arguments)},function:n}[typeof n];return e?r(e,"fn-",null,e.name||"anonymous"):n}));this.wrapped=e[1]=i}})),t.on(ne+"-start",(function(e){e[1]=this.wrapped||e[1]})),t}function oe(e,t){let r=e;for(;"object"==typeof r&&!Object.prototype.hasOwnProperty.call(r,re);)r=Object.getPrototypeOf(r);for(var n=arguments.length,i=new Array(n>2?n-2:0),o=2;o<n;o++)i[o-2]=arguments[o];r&&t(r,...i)}var ae="fetch-",se=ae+"body-",ce=["arrayBuffer","blob","json","text","formData"],ue=h._A.Request,de=h._A.Response,fe="prototype",le="nr@context";const he={};function ge(e){const t=function(e){return(e||B.ee).get("fetch")}(e);if(!(ue&&de&&h._A.fetch))return t;if(he[t.debugId]++)return t;function r(e,r,n){var i=e[r];"function"==typeof i&&(e[r]=function(){var e,r=U()(arguments),o={};t.emit(n+"before-start",[r],o),o[le]&&o[le].dt&&(e=o[le].dt);var a=i.apply(this,r);return t.emit(n+"start",[r,e],a),a.then((function(e){return t.emit(n+"end",[null,e],a),e}),(function(e){throw t.emit(n+"end",[e],a),e}))})}return he[t.debugId]=1,ce.forEach((e=>{r(ue[fe],e,se),r(de[fe],e,se)})),r(h._A,"fetch",ae),t.on(ae+"end",(function(e,r){var n=this;if(r){var i=r.headers.get("content-length");null!==i&&(n.rxSize=i),t.emit(ae+"done",[null,r],n)}else t.emit(ae+"done",[e],n)})),t}const pe={},ve=["pushState","replaceState"];function me(e){const t=function(e){return(e||B.ee).get("history")}(e);return!h.il||pe[t.debugId]++||(pe[t.debugId]=1,V(t).inPlace(window.history,ve,"-")),t}const be={},ye=["appendChild","insertBefore","replaceChild"];function we(e){const t=function(e){return(e||B.ee).get("jsonp")}(e);if(!h.il||be[t.debugId])return t;be[t.debugId]=!0;var r=V(t),n=/[?&](?:callback|cb)=([^&#]+)/,i=/(.*)\.([^.]+)/,o=/^(\w+)(\.|$)(.*)$/;function a(e,t){var r=e.match(o),n=r[1],i=r[3];return i?a(i,t[n]):t[n]}return r.inPlace(Node.prototype,ye,"dom-"),t.on("dom-start",(function(e){!function(e){if(!e||"string"!=typeof e.nodeName||"script"!==e.nodeName.toLowerCase())return;if("function"!=typeof e.addEventListener)return;var o=(s=e.src,c=s.match(n),c?c[1]:null);var s,c;if(!o)return;var u=function(e){var t=e.match(i);if(t&&t.length>=3)return{key:t[2],parent:a(t[1],window)};return{key:e,parent:window}}(o);if("function"!=typeof u.parent[u.key])return;var d={};function f(){t.emit("jsonp-end",[],d),e.removeEventListener("load",f,(0,j.m$)(!1)),e.removeEventListener("error",l,(0,j.m$)(!1))}function l(){t.emit("jsonp-error",[],d),t.emit("jsonp-end",[],d),e.removeEventListener("load",f,(0,j.m$)(!1)),e.removeEventListener("error",l,(0,j.m$)(!1))}r.inPlace(u.parent,[u.key],"cb-",d),e.addEventListener("load",f,(0,j.m$)(!1)),e.addEventListener("error",l,(0,j.m$)(!1)),t.emit("new-jsonp",[e.src],d)}(e[0])})),t}const Ee={};function Ae(e){const r=function(e){return(e||B.ee).get("mutation")}(e);if(!h.il||Ee[r.debugId])return r;Ee[r.debugId]=!0;var n=V(r),i=t.Yu.MO;return i&&(window.MutationObserver=function(e){return this instanceof i?new i(n(e,"fn-")):i.apply(this,arguments)},MutationObserver.prototype=i.prototype),r}const xe={};function Te(e){const r=function(e){return(e||B.ee).get("promise")}(e);if(xe[r.debugId])return r;xe[r.debugId]=!0;var n=B.c,i=V(r),o=t.Yu.PR;return o&&function(){function e(t){var n=r.context(),a=i(t,"executor-",n,null,!1);const s=Reflect.construct(o,[a],e);return r.context(s).getCtx=function(){return n},s}h._A.Promise=e,Object.defineProperty(e,"name",{value:"Promise"}),e.toString=function(){return o.toString()},Object.setPrototypeOf(e,o),["all","race"].forEach((function(t){const n=o[t];e[t]=function(e){let i=!1;e?.forEach((e=>{this.resolve(e).then(a("all"===t),a(!1))}));const o=n.apply(this,arguments);return o;function a(e){return function(){r.emit("propagate",[null,!i],o,!1,!1),i=i||!e}}}})),["resolve","reject"].forEach((function(t){const n=o[t];e[t]=function(e){const t=n.apply(this,arguments);return e!==t&&r.emit("propagate",[e,!0],t,!1,!1),t}})),e.prototype=o.prototype;const t=o.prototype.then;o.prototype.then=function(){var e=this,o=n(e);o.promise=e;for(var a=arguments.length,s=new Array(a),c=0;c<a;c++)s[c]=arguments[c];s[0]=i(s[0],"cb-",o,null,!1),s[1]=i(s[1],"cb-",o,null,!1);const u=t.apply(this,s);return o.nextPromise=u,r.emit("propagate",[e,!0],u,!1,!1),u},o.prototype.then[q]=t,r.on("executor-start",(function(e){e[0]=i(e[0],"resolve-",this,null,!1),e[1]=i(e[1],"resolve-",this,null,!1)})),r.on("executor-err",(function(e,t,r){e[1](r)})),r.on("cb-end",(function(e,t,n){r.emit("propagate",[n,!0],this.nextPromise,!1,!1)})),r.on("propagate",(function(e,t,n){this.getCtx&&!t||(this.getCtx=function(){if(e instanceof Promise)var t=r.context(e);return t&&t.getCtx?t.getCtx():this})}))}(),r}const _e={};function Se(e){const t=function(e){return(e||B.ee).get("raf")}(e);if(!h.il||_e[t.debugId]++)return t;_e[t.debugId]=1;var r=V(t);return r.inPlace(window,["requestAnimationFrame"],"raf-"),t.on("raf-start",(function(e){e[0]=r(e[0],"fn-")})),t}const De={},Ne="setTimeout",Oe="setInterval",je="clearTimeout",Ce="-start",Ie=[Ne,"setImmediate",Oe,je,"clearImmediate"];function Re(e){const t=function(e){return(e||B.ee).get("timer")}(e);if(De[t.debugId]++)return t;De[t.debugId]=1;var r=V(t);return r.inPlace(h._A,Ie.slice(0,2),Ne+"-"),r.inPlace(h._A,Ie.slice(2,3),Oe+"-"),r.inPlace(h._A,Ie.slice(3),je+"-"),t.on(Oe+Ce,(function(e,t,n){e[0]=r(e[0],"fn-",null,n)})),t.on(Ne+Ce,(function(e,t,n){this.method=n,this.timerDuration=isNaN(e[1])?0:+e[1],e[0]=r(e[0],"fn-",this,n)})),t}const Pe={},ke=["open","send"];function He(e){var r=e||B.ee;const n=function(e){return(e||B.ee).get("xhr")}(r);if(Pe[n.debugId]++)return n;Pe[n.debugId]=1,ie(r);var i=V(n),o=t.Yu.XHR,a=t.Yu.MO,s=t.Yu.PR,c=t.Yu.SI,u="readystatechange",d=["onload","onerror","onabort","onloadstart","onloadend","onprogress","ontimeout"],f=[],l=h._A.XMLHttpRequest.listeners,p=h._A.XMLHttpRequest=function(e){var t=new o(e);function r(){try{n.emit("new-xhr",[t],t),t.addEventListener(u,m,(0,j.m$)(!1))}catch(e){(0,g.Z)("An error occured while intercepting XHR",e);try{n.emit("internal-error",[e])}catch(e){}}}return this.listeners=l?[...l,r]:[r],this.listeners.forEach((e=>e())),t};function v(e,t){i.inPlace(t,["onreadystatechange"],"fn-",A)}function m(){var e=this,t=n.context(e);e.readyState>3&&!t.resolved&&(t.resolved=!0,n.emit("xhr-resolved",[],e)),i.inPlace(e,d,"fn-",A)}if(function(e,t){for(var r in e)t[r]=e[r]}(o,p),p.prototype=o.prototype,i.inPlace(p.prototype,ke,"-xhr-",A),n.on("send-xhr-start",(function(e,t){v(e,t),function(e){f.push(e),a&&(b?b.then(E):c?c(E):(y=-y,w.data=y))}(t)})),n.on("open-xhr-start",v),a){var b=s&&s.resolve();if(!c&&!s){var y=1,w=document.createTextNode(y);new a(E).observe(w,{characterData:!0})}}else r.on("fn-end",(function(e){e[0]&&e[0].type===u||E()}));function E(){for(var e=0;e<f.length;e++)v(0,f[e]);f.length&&(f=[])}function A(e,t){return t}return n}class Le extends p{static featureName=M.t9;constructor(t,r){let n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];super(t,r,M.t9,n),function(e){if(!H){if(R){H=Worker;try{h._A.Worker=r(H,"Dedicated")}catch(e){o(e,"Dedicated")}if(P){L=SharedWorker;try{h._A.SharedWorker=r(L,"Shared")}catch(e){o(e,"Shared")}}else n("Shared");if(k){z=navigator.serviceWorker.register;try{h._A.navigator.serviceWorker.register=(t=z,function(){for(var e=arguments.length,r=new Array(e),n=0;n<e;n++)r[n]=arguments[n];return i("Service",r[1]?.type),t.apply(navigator.serviceWorker,r)})}catch(e){o(e,"Service")}}else n("Service");var t;return}n("All")}function r(e,t){return"undefined"==typeof Proxy?e:new Proxy(e,{construct:(e,r)=>(i(t,r[1]?.type),new e(...r))})}function n(t){h.v6||e("Workers/".concat(t,"/Unavailable"))}function i(t,r){e("Workers/".concat(t,"module"===r?"/Module":"/Classic"))}function o(t,r){e("Workers/".concat(r,"/SM/Unsupported")),(0,g.Z)("NR Agent: Unable to capture ".concat(r," workers."),t)}}((t=>(0,c.p)(M.xS,[t],void 0,e.D.metrics,this.ee))),this.addConsoleSupportabilityMetrics(),this.importAggregator()}addConsoleSupportabilityMetrics(){const t=J(this.ee);for(const r of["Debug","Error","Info","Log","Trace","Warn"])t.on("".concat(r.toLowerCase(),"-console-start"),(function(n,i){let o=[];for(const e of n)"function"==typeof e||e&&e.message&&e.stack?o.push(e.toString()):o.push(e);const a=(0,N.P)(o);(0,c.p)(M.xS,["Console/".concat(r,"/Seen"),a.length],void 0,e.D.metrics,t)}))}}var ze,Me={};try{ze=localStorage.getItem("__nr_flags").split(","),console&&"function"==typeof console.log&&(Me.console=!0,-1!==ze.indexOf("dev")&&(Me.dev=!0),-1!==ze.indexOf("nr_dev")&&(Me.nrDev=!0))}catch(e){}function Be(e){try{Me.console&&Be(e)}catch(e){}}Me.nrDev&&B.ee.on("internal-error",(function(e){Be(e.stack)})),Me.dev&&B.ee.on("fn-err",(function(e,t,r){Be(r.stack)})),Me.dev&&(Be("NR AGENT IN DEVELOPMENT MODE"),Be("flags: "+(0,w.D)(Me,(function(e,t){return e})).join(", ")));var Fe=i(8322);class Ue extends p{static featureName=Fe.t;constructor(r,n){let i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];super(r,n,Fe.t,i),this.skipNext=0;try{this.removeOnAbort=new AbortController}catch(e){}const o=this;o.ee.on("fn-start",(function(e,t,r){o.abortHandler&&(o.skipNext+=1)})),o.ee.on("fn-err",(function(e,t,r){o.abortHandler&&!r[Fe.A]&&((0,K.X)(r,Fe.A,(function(){return!0})),this.thrown=!0,We(r,void 0,o.ee))})),o.ee.on("fn-end",(function(){o.abortHandler&&!this.thrown&&o.skipNext>0&&(o.skipNext-=1)})),o.ee.on("internal-error",(function(t){(0,c.p)("ierr",[t,(0,m.z)(),!0],void 0,e.D.jserrors,o.ee)})),this.origOnerror=h._A.onerror,h._A.onerror=this.onerrorHandler.bind(this),h._A.addEventListener("unhandledrejection",(t=>{const r=function(e){let t="Unhandled Promise Rejection: ";if(e instanceof Error)try{return e.message=t+e.message,e}catch(t){return e}if(void 0===e)return new Error(t);try{return new Error(t+(0,N.P)(e))}catch(e){return new Error(t)}}(t.reason);(0,c.p)("err",[r,(0,m.z)(),!1,{unhandledPromiseRejection:1}],void 0,e.D.jserrors,this.ee)}),(0,j.m$)(!1,this.removeOnAbort?.signal)),Se(this.ee),Re(this.ee),ie(this.ee),(0,t.OP)(r).xhrWrappable&&He(this.ee),this.abortHandler=this.#e,this.importAggregator()}#e(){this.removeOnAbort?.abort(),this.abortHandler=void 0}onerrorHandler(t,r,n,i,o){"function"==typeof this.origOnerror&&this.origOnerror(...arguments);try{this.skipNext?this.skipNext-=1:We(o||new qe(t,r,n),!0,this.ee)}catch(t){try{(0,c.p)("ierr",[t,(0,m.z)(),!0],void 0,e.D.jserrors,this.ee)}catch(e){}}return!1}}function qe(e,t,r){this.message=e||"Uncaught error with no additional information",this.sourceURL=t,this.line=r}function We(t,r,n){var i=r?null:(0,m.z)();(0,c.p)("err",[t,i],void 0,e.D.jserrors,n)}var Ge=1,Ve="nr@id";function Xe(e){var t=typeof e;return!e||"object"!==t&&"function"!==t?-1:e===h._A?0:(0,K.X)(e,Ve,(function(){return Ge++}))}var Ze=i(9071);function $e(e){if("string"==typeof e&&e.length)return e.length;if("object"==typeof e){if("undefined"!=typeof ArrayBuffer&&e instanceof ArrayBuffer&&e.byteLength)return e.byteLength;if("undefined"!=typeof Blob&&e instanceof Blob&&e.size)return e.size;if(!("undefined"!=typeof FormData&&e instanceof FormData))try{return(0,N.P)(e).length}catch(e){return}}}var Ye=i(6368);class Qe{constructor(e){this.agentIdentifier=e,this.generateTracePayload=this.generateTracePayload.bind(this),this.shouldGenerateTrace=this.shouldGenerateTrace.bind(this)}generateTracePayload(e){if(!this.shouldGenerateTrace(e))return null;var r=(0,t.DL)(this.agentIdentifier);if(!r)return null;var n=(r.accountID||"").toString()||null,i=(r.agentID||"").toString()||null,o=(r.trustKey||"").toString()||null;if(!n||!i)return null;var a=(0,D.M)(),s=(0,D.Ht)(),c=Date.now(),u={spanId:a,traceId:s,timestamp:c};return(e.sameOrigin||this.isAllowedOrigin(e)&&this.useTraceContextHeadersForCors())&&(u.traceContextParentHeader=this.generateTraceContextParentHeader(a,s),u.traceContextStateHeader=this.generateTraceContextStateHeader(a,c,n,i,o)),(e.sameOrigin&&!this.excludeNewrelicHeader()||!e.sameOrigin&&this.isAllowedOrigin(e)&&this.useNewrelicHeaderForCors())&&(u.newrelicHeader=this.generateTraceHeader(a,s,c,n,i,o)),u}generateTraceContextParentHeader(e,t){return"00-"+t+"-"+e+"-01"}generateTraceContextStateHeader(e,t,r,n,i){return i+"@nr=0-1-"+r+"-"+n+"-"+e+"----"+t}generateTraceHeader(e,t,r,n,i,o){if(!("function"==typeof h._A?.btoa))return null;var a={v:[0,1],d:{ty:"Browser",ac:n,ap:i,id:e,tr:t,ti:r}};return o&&n!==o&&(a.d.tk=o),btoa((0,N.P)(a))}shouldGenerateTrace(e){return this.isDtEnabled()&&this.isAllowedOrigin(e)}isAllowedOrigin(e){var r=!1,n={};if((0,t.Mt)(this.agentIdentifier,"distributed_tracing")&&(n=(0,t.P_)(this.agentIdentifier).distributed_tracing),e.sameOrigin)r=!0;else if(n.allowed_origins instanceof Array)for(var i=0;i<n.allowed_origins.length;i++){var o=(0,Ye.e)(n.allowed_origins[i]);if(e.hostname===o.hostname&&e.protocol===o.protocol&&e.port===o.port){r=!0;break}}return r}isDtEnabled(){var e=(0,t.Mt)(this.agentIdentifier,"distributed_tracing");return!!e&&!!e.enabled}excludeNewrelicHeader(){var e=(0,t.Mt)(this.agentIdentifier,"distributed_tracing");return!!e&&!!e.exclude_newrelic_header}useNewrelicHeaderForCors(){var e=(0,t.Mt)(this.agentIdentifier,"distributed_tracing");return!!e&&!1!==e.cors_use_newrelic_header}useTraceContextHeadersForCors(){var e=(0,t.Mt)(this.agentIdentifier,"distributed_tracing");return!!e&&!!e.cors_use_tracecontext_headers}}var Je=i(8675),Ke=["load","error","abort","timeout"],et=Ke.length,tt=t.Yu.REQ,rt=h._A.XMLHttpRequest;class nt extends p{static featureName=Je.t;constructor(r,n){let i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];super(r,n,Je.t,i),(0,t.OP)(r).xhrWrappable&&(this.dt=new Qe(r),this.handler=(e,t,r,n)=>(0,c.p)(e,t,r,n,this.ee),ge(this.ee),He(this.ee),function(r,n,i,o){function a(e){var t=this;t.totalCbs=0,t.called=0,t.cbTime=0,t.end=x,t.ended=!1,t.xhrGuids={},t.lastSize=null,t.loadCaptureCalled=!1,t.params=this.params||{},t.metrics=this.metrics||{},e.addEventListener("load",(function(r){_(t,e)}),(0,j.m$)(!1)),Ze.I||e.addEventListener("progress",(function(e){t.lastSize=e.loaded}),(0,j.m$)(!1))}function s(e){this.params={method:e[0]},T(this,e[1]),this.metrics={}}function c(e,n){var i=(0,t.DL)(r);"xpid"in i&&this.sameOrigin&&n.setRequestHeader("X-NewRelic-ID",i.xpid);var a=o.generateTracePayload(this.parsedOrigin);if(a){var s=!1;a.newrelicHeader&&(n.setRequestHeader("newrelic",a.newrelicHeader),s=!0),a.traceContextParentHeader&&(n.setRequestHeader("traceparent",a.traceContextParentHeader),a.traceContextStateHeader&&n.setRequestHeader("tracestate",a.traceContextStateHeader),s=!0),s&&(this.dt=a)}}function u(e,t){var r=this.metrics,i=e[0],o=this;if(r&&i){var a=$e(i);a&&(r.txSize=a)}this.startTime=(0,m.z)(),this.listener=function(e){try{"abort"!==e.type||o.loadCaptureCalled||(o.params.aborted=!0),("load"!==e.type||o.called===o.totalCbs&&(o.onloadCalled||"function"!=typeof t.onload)&&"function"==typeof o.end)&&o.end(t)}catch(e){try{n.emit("internal-error",[e])}catch(e){}}};for(var s=0;s<et;s++)t.addEventListener(Ke[s],this.listener,(0,j.m$)(!1))}function d(e,t,r){this.cbTime+=e,t?this.onloadCalled=!0:this.called+=1,this.called!==this.totalCbs||!this.onloadCalled&&"function"==typeof r.onload||"function"!=typeof this.end||this.end(r)}function f(e,t){var r=""+Xe(e)+!!t;this.xhrGuids&&!this.xhrGuids[r]&&(this.xhrGuids[r]=!0,this.totalCbs+=1)}function l(e,t){var r=""+Xe(e)+!!t;this.xhrGuids&&this.xhrGuids[r]&&(delete this.xhrGuids[r],this.totalCbs-=1)}function g(){this.endTime=(0,m.z)()}function p(e,t){t instanceof rt&&"load"===e[0]&&n.emit("xhr-load-added",[e[1],e[2]],t)}function v(e,t){t instanceof rt&&"load"===e[0]&&n.emit("xhr-load-removed",[e[1],e[2]],t)}function b(e,t,r){t instanceof rt&&("onload"===r&&(this.onload=!0),("load"===(e[0]&&e[0].type)||this.onload)&&(this.xhrCbStart=(0,m.z)()))}function y(e,t){this.xhrCbStart&&n.emit("xhr-cb-time",[(0,m.z)()-this.xhrCbStart,this.onload,t],t)}function w(e){var t,r=e[1]||{};"string"==typeof e[0]?t=e[0]:e[0]&&e[0].url?t=e[0].url:h._A?.URL&&e[0]&&e[0]instanceof URL&&(t=e[0].href),t&&(this.parsedOrigin=(0,Ye.e)(t),this.sameOrigin=this.parsedOrigin.sameOrigin);var n=o.generateTracePayload(this.parsedOrigin);if(n&&(n.newrelicHeader||n.traceContextParentHeader))if("string"==typeof e[0]||h._A?.URL&&e[0]&&e[0]instanceof URL){var i={};for(var a in r)i[a]=r[a];i.headers=new Headers(r.headers||{}),s(i.headers,n)&&(this.dt=n),e.length>1?e[1]=i:e.push(i)}else e[0]&&e[0].headers&&s(e[0].headers,n)&&(this.dt=n);function s(e,t){var r=!1;return t.newrelicHeader&&(e.set("newrelic",t.newrelicHeader),r=!0),t.traceContextParentHeader&&(e.set("traceparent",t.traceContextParentHeader),t.traceContextStateHeader&&e.set("tracestate",t.traceContextStateHeader),r=!0),r}}function E(e,t){this.params={},this.metrics={},this.startTime=(0,m.z)(),this.dt=t,e.length>=1&&(this.target=e[0]),e.length>=2&&(this.opts=e[1]);var r,n=this.opts||{},i=this.target;"string"==typeof i?r=i:"object"==typeof i&&i instanceof tt?r=i.url:h._A?.URL&&"object"==typeof i&&i instanceof URL&&(r=i.href),T(this,r);var o=(""+(i&&i instanceof tt&&i.method||n.method||"GET")).toUpperCase();this.params.method=o,this.txSize=$e(n.body)||0}function A(t,r){var n;this.endTime=(0,m.z)(),this.params||(this.params={}),this.params.status=r?r.status:0,"string"==typeof this.rxSize&&this.rxSize.length>0&&(n=+this.rxSize);var o={txSize:this.txSize,rxSize:n,duration:(0,m.z)()-this.startTime};i("xhr",[this.params,o,this.startTime,this.endTime,"fetch"],this,e.D.ajax)}function x(t){var r=this.params,n=this.metrics;if(!this.ended){this.ended=!0;for(var o=0;o<et;o++)t.removeEventListener(Ke[o],this.listener,!1);r.aborted||(n.duration=(0,m.z)()-this.startTime,this.loadCaptureCalled||4!==t.readyState?null==r.status&&(r.status=0):_(this,t),n.cbTime=this.cbTime,i("xhr",[r,n,this.startTime,this.endTime,"xhr"],this,e.D.ajax))}}function T(e,t){var r=(0,Ye.e)(t),n=e.params;n.hostname=r.hostname,n.port=r.port,n.protocol=r.protocol,n.host=r.hostname+":"+r.port,n.pathname=r.pathname,e.parsedOrigin=r,e.sameOrigin=r.sameOrigin}function _(e,t){e.params.status=t.status;var r=function(e,t){var r=e.responseType;return"json"===r&&null!==t?t:"arraybuffer"===r||"blob"===r||"json"===r?$e(e.response):"text"===r||""===r||void 0===r?$e(e.responseText):void 0}(t,e.lastSize);if(r&&(e.metrics.rxSize=r),e.sameOrigin){var n=t.getResponseHeader("X-NewRelic-App-Data");n&&(e.params.cat=n.split(", ").pop())}e.loadCaptureCalled=!0}n.on("new-xhr",a),n.on("open-xhr-start",s),n.on("open-xhr-end",c),n.on("send-xhr-start",u),n.on("xhr-cb-time",d),n.on("xhr-load-added",f),n.on("xhr-load-removed",l),n.on("xhr-resolved",g),n.on("addEventListener-end",p),n.on("removeEventListener-end",v),n.on("fn-end",y),n.on("fetch-before-start",w),n.on("fetch-start",E),n.on("fn-start",b),n.on("fetch-done",A)}(r,this.ee,this.handler,this.dt),this.importAggregator())}}var it=i(6408),ot=i(2628);const{BST_RESOURCE:at,BST_TIMER:st,END:ct,FEATURE_NAME:ut,FN_END:dt,FN_START:ft,ADD_EVENT_LISTENER:lt,PUSH_STATE:ht,RESOURCE:gt,RESOURCE_TIMING_BUFFER_FULL:pt,START:vt,ORIG_EVENT:mt}=ot,bt="clearResourceTimings";var yt=i(755);const{FEATURE_NAME:wt,START:Et,END:At,BODY:xt,CB_END:Tt,JS_TIME:_t,FETCH:St,FN_START:Dt,CB_START:Nt,FN_END:Ot}=yt;var jt=i(6486);class Ct extends p{static featureName=jt.t;constructor(e,t){let r=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];super(e,t,jt.t,r),this.importAggregator()}}new class{constructor(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:(0,D.ky)(16);this.agentIdentifier=t,this.sharedAggregator=new E({agentIdentifier:this.agentIdentifier}),this.features={},this.desiredFeatures=new Set(e.features||[]),this.desiredFeatures.add(b),Object.assign(this,(0,a.j)(this.agentIdentifier,e,e.loaderType||"agent")),this.start()}get config(){return{info:(0,t.C5)(this.agentIdentifier),init:(0,t.P_)(this.agentIdentifier),loader_config:(0,t.DL)(this.agentIdentifier),runtime:(0,t.OP)(this.agentIdentifier)}}start(){const t="features";try{const r=n(this.agentIdentifier),i=Array.from(this.desiredFeatures);i.sort(((t,r)=>e.p[t.featureName]-e.p[r.featureName])),i.forEach((t=>{if(r[t.featureName]||t.featureName===e.D.pageViewEvent){const e=(0,s.Z)(t.featureName);e.every((e=>r[e]))||(0,g.Z)("".concat(t.featureName," is enabled but one or more dependent features has been disabled (").concat((0,N.P)(e),"). This may cause unintended consequences or missing data...")),this.features[t.featureName]=new t(this.agentIdentifier,this.sharedAggregator)}})),(0,S.Qy)(this.agentIdentifier,this.features,t)}catch(e){(0,g.Z)("Failed to initialize all enabled instrument classes (agent aborted) -",e);for(const e in this.features)this.features[e].abortHandler?.();const r=(0,S.fP)();return delete r.initializedAgents[this.agentIdentifier]?.api,delete r.initializedAgents[this.agentIdentifier]?.[t],delete this.sharedAggregator,r.ee?.abort(),delete r.ee?.get(this.agentIdentifier),!1}}}({features:[nt,b,I,class extends p{static featureName=ut;constructor(t,r){if(super(t,r,ut,!(arguments.length>2&&void 0!==arguments[2])||arguments[2]),!h.il)return;const n=this.ee;this.timerEE=Re(n),this.rafEE=Se(n),me(n),ie(n),n.on(ft,(function(e,t){e[0]instanceof mt&&(this.bstStart=(0,m.z)())})),n.on(dt,(function(t,r){var i=t[0];i instanceof mt&&(0,c.p)("bst",[i,r,this.bstStart,(0,m.z)()],void 0,e.D.sessionTrace,n)})),this.timerEE.on(ft,(function(e,t,r){this.bstStart=(0,m.z)(),this.bstType=r})),this.timerEE.on(dt,(function(t,r){(0,c.p)(st,[r,this.bstStart,(0,m.z)(),this.bstType],void 0,e.D.sessionTrace,n)})),this.rafEE.on(ft,(function(){this.bstStart=(0,m.z)()})),this.rafEE.on(dt,(function(t,r){(0,c.p)(st,[r,this.bstStart,(0,m.z)(),"requestAnimationFrame"],void 0,e.D.sessionTrace,n)})),n.on(ht+vt,(function(e){this.time=(0,m.z)(),this.startPath=location.pathname+location.hash})),n.on(ht+ct,(function(t){(0,c.p)("bstHist",[location.pathname+location.hash,this.startPath,this.time],void 0,e.D.sessionTrace,n)})),(0,it.W)()?((0,c.p)(at,[window.performance.getEntriesByType("resource")],void 0,e.D.sessionTrace,n),function(){var t=new PerformanceObserver(((t,r)=>{var i=t.getEntries();(0,c.p)(at,[i],void 0,e.D.sessionTrace,n)}));try{t.observe({entryTypes:["resource"]})}catch(e){}}()):window.performance[bt]&&window.performance[lt]&&window.performance.addEventListener(pt,this.onResourceTimingBufferFull,(0,j.m$)(!1)),document.addEventListener("scroll",this.noOp,(0,j.m$)(!1)),document.addEventListener("keypress",this.noOp,(0,j.m$)(!1)),document.addEventListener("click",this.noOp,(0,j.m$)(!1)),this.abortHandler=this.#e,this.importAggregator()}#e(){window.performance.removeEventListener(pt,this.onResourceTimingBufferFull,!1),this.abortHandler=void 0}noOp(e){}onResourceTimingBufferFull(t){if((0,c.p)(at,[window.performance.getEntriesByType(gt)],void 0,e.D.sessionTrace,this.ee),window.performance[bt])try{window.performance.removeEventListener(pt,this.onResourceTimingBufferFull,!1)}catch(e){}}},Le,Ct,Ue,class extends p{static featureName=wt;constructor(e,r){if(super(e,r,wt,!(arguments.length>2&&void 0!==arguments[2])||arguments[2]),!h.il)return;if(!(0,t.OP)(e).xhrWrappable)return;try{this.removeOnAbort=new AbortController}catch(e){}let n,i=0;const o=this.ee.get("tracer"),a=we(this.ee),s=Te(this.ee),c=Re(this.ee),u=He(this.ee),d=this.ee.get("events"),f=ge(this.ee),l=me(this.ee),g=Ae(this.ee);function p(e,t){l.emit("newURL",[""+window.location,t])}function v(){i++,n=window.location.hash,this[Dt]=(0,m.z)()}function b(){i--,window.location.hash!==n&&p(0,!0);var e=(0,m.z)();this[_t]=~~this[_t]+e-this[Dt],this[Ot]=e}function y(e,t){e.on(t,(function(){this[t]=(0,m.z)()}))}this.ee.on(Dt,v),s.on(Nt,v),a.on(Nt,v),this.ee.on(Ot,b),s.on(Tt,b),a.on(Tt,b),this.ee.buffer([Dt,Ot,"xhr-resolved"],this.featureName),d.buffer([Dt],this.featureName),c.buffer(["setTimeout"+At,"clearTimeout"+Et,Dt],this.featureName),u.buffer([Dt,"new-xhr","send-xhr"+Et],this.featureName),f.buffer([St+Et,St+"-done",St+xt+Et,St+xt+At],this.featureName),l.buffer(["newURL"],this.featureName),g.buffer([Dt],this.featureName),s.buffer(["propagate",Nt,Tt,"executor-err","resolve"+Et],this.featureName),o.buffer([Dt,"no-"+Dt],this.featureName),a.buffer(["new-jsonp","cb-start","jsonp-error","jsonp-end"],this.featureName),y(f,St+Et),y(f,St+"-done"),y(a,"new-jsonp"),y(a,"jsonp-end"),y(a,"cb-start"),l.on("pushState-end",p),l.on("replaceState-end",p),window.addEventListener("hashchange",p,(0,j.m$)(!0,this.removeOnAbort?.signal)),window.addEventListener("load",p,(0,j.m$)(!0,this.removeOnAbort?.signal)),window.addEventListener("popstate",(function(){p(0,i>1)}),(0,j.m$)(!0,this.removeOnAbort?.signal)),this.abortHandler=this.#e,this.importAggregator()}#e(){this.removeOnAbort?.abort(),this.abortHandler=void 0}}],loaderType:"spa"})})(),window.NRBA=o})();</script>
<meta content="width=device-width, initial-scale=1" name="viewport"/>
<link href="http://gmpg.org/xfn/11" rel="profile"/>
<title>People – Department of Computer Science and Statistics</title>
<meta content="max-image-preview:large" name="robots">
<link href="//web.uri.edu" rel="dns-prefetch">
<link href="//s.w.org" rel="dns-prefetch"/>
<link href="https://web.uri.edu/cs/feed/" rel="alternate" title="Department of Computer Science and Statistics » Feed" type="application/rss+xml"/>
<link href="https://web.uri.edu/cs/comments/feed/" rel="alternate" title="Department of Computer Science and Statistics » Comments Feed" type="application/rss+xml"/>
<script type="text/javascript">
window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/13.0.1\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/13.0.1\/svg\/","svgExt":".svg","source":{"concatemoji":"https:\/\/web.uri.edu\/cs\/wp-includes\/js\/wp-emoji-release.min.js?ver=5.7.1"}};
!function(e,a,t){var n,r,o,i=a.createElement("canvas"),p=i.getContext&&i.getContext("2d");function s(e,t){var a=String.fromCharCode;p.clearRect(0,0,i.width,i.height),p.fillText(a.apply(this,e),0,0);e=i.toDataURL();return p.clearRect(0,0,i.width,i.height),p.fillText(a.apply(this,t),0,0),e===i.toDataURL()}function c(e){var t=a.createElement("script");t.src=e,t.defer=t.type="text/javascript",a.getElementsByTagName("head")[0].appendChild(t)}for(o=Array("flag","emoji"),t.supports={everything:!0,everythingExceptFlag:!0},r=0;r<o.length;r++)t.supports[o[r]]=function(e){if(!p||!p.fillText)return!1;switch(p.textBaseline="top",p.font="600 32px Arial",e){case"flag":return s([127987,65039,8205,9895,65039],[127987,65039,8203,9895,65039])?!1:!s([55356,56826,55356,56819],[55356,56826,8203,55356,56819])&&!s([55356,57332,56128,56423,56128,56418,56128,56421,56128,56430,56128,56423,56128,56447],[55356,57332,8203,56128,56423,8203,56128,56418,8203,56128,56421,8203,56128,56430,8203,56128,56423,8203,56128,56447]);case"emoji":return!s([55357,56424,8205,55356,57212],[55357,56424,8203,55356,57212])}return!1}(o[r]),t.supports.everything=t.supports.everything&&t.supports[o[r]],"flag"!==o[r]&&(t.supports.everythingExceptFlag=t.supports.everythingExceptFlag&&t.supports[o[r]]);t.supports.everythingExceptFlag=t.supports.everythingExceptFlag&&!t.supports.flag,t.DOMReady=!1,t.readyCallback=function(){t.DOMReady=!0},t.supports.everything||(n=function(){t.readyCallback()},a.addEventListener?(a.addEventListener("DOMContentLoaded",n,!1),e.addEventListener("load",n,!1)):(e.attachEvent("onload",n),a.attachEvent("onreadystatechange",function(){"complete"===a.readyState&&t.readyCallback()})),(n=t.source||{}).concatemoji?c(n.concatemoji):n.wpemoji&&n.twemoji&&(c(n.twemoji),c(n.wpemoji)))}(window,document,window._wpemojiSettings);
</script>
<style type="text/css">
img.wp-smiley,
img.emoji {
display: inline !important;
border: none !important;
box-shadow: none !important;
height: 1em !important;
width: 1em !important;
margin: 0 .07em !important;
vertical-align: -0.1em !important;
background: none !important;
padding: 0 !important;
}
</style>
<link href="https://web.uri.edu/cs/wp-includes/css/dist/block-library/style.min.css?ver=5.7.1" id="wp-block-library-css" media="all" rel="stylesheet" type="text/css"/>
<link href="https://web.uri.edu/cs/wp-content/plugins/uri-component-library/css/cl.built.css?ver=5.0.2" id="uricl-css-css" media="all" rel="stylesheet" type="text/css"/>
<link href="https://web.uri.edu/cs/wp-content/plugins/uri-kuali/css/uri-kuali.css?ver=5.7.1" id="uri-kuali-styles-css" media="all" rel="stylesheet" type="text/css"/>
<link href="https://web.uri.edu/cs/wp-content/plugins/uri-tides/css/tides.css?ver=5.7.1" id="uri-tides-css-css" media="all" rel="stylesheet" type="text/css"/>
<link href="https://web.uri.edu/cs/wp-content/plugins/uri-people-tool/assets/people.css?ver=5.7.1" id="uri-people-styles-css" media="all" rel="stylesheet" type="text/css"/>
<link href="https://web.uri.edu/cs/wp-content/plugins/wp-lightbox-2/styles/lightbox.min.css?ver=1.3.4" id="wp-lightbox-2.min.css-css" media="all" rel="stylesheet" type="text/css"/>
<link href="https://web.uri.edu/cs/wp-content/themes/uri-modern/style.css?ver=2.5.0" id="uri-modern-style-css" media="all" rel="stylesheet" type="text/css"/>
<link href="https://web.uri.edu/cs/wp-content/plugins/tablepress/css/default.min.css?ver=1.14" id="tablepress-default-css" media="all" rel="stylesheet" type="text/css"/>
<script id="jquery-core-js" src="https://web.uri.edu/cs/wp-includes/js/jquery/jquery.min.js?ver=3.5.1" type="text/javascript"></script>
<script id="jquery-migrate-js" src="https://web.uri.edu/cs/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.3.2" type="text/javascript"></script>
<link href="https://web.uri.edu/cs/wp-json/" rel="https://api.w.org/"/><link href="https://web.uri.edu/cs/wp-json/wp/v2/pages/629" rel="alternate" type="application/json"/><link href="https://web.uri.edu/cs/xmlrpc.php?rsd" rel="EditURI" title="RSD" type="application/rsd+xml"/>
<link href="https://web.uri.edu/cs/wp-includes/wlwmanifest.xml" rel="wlwmanifest" type="application/wlwmanifest+xml"/>
<meta content="WordPress 5.7.1" name="generator">
<link href="https://web.uri.edu/cs/people/" rel="canonical"/>
<link href="https://web.uri.edu/cs/?p=629" rel="shortlink"/>
<link href="https://web.uri.edu/cs/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fweb.uri.edu%2Fcs%2Fpeople%2F" rel="alternate" type="application/json+oembed"/>
<link href="https://web.uri.edu/cs/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fweb.uri.edu%2Fcs%2Fpeople%2F&format=xml" rel="alternate" type="text/xml+oembed"/>
<meta content="People Full-time Faculty Adjunct Faculty and Limited Join Appointments" name="description"/>
<meta content="summary_large_image" name="twitter:card"/>
<meta content="@universityofri" name="twitter:site"/>
<meta content="@universityofri" name="twitter:creator"/>
<meta content="https://web.uri.edu/cs/people/" property="og:url"/>
<meta content="People" property="og:title"/>
<meta content="People Full-time Faculty Adjunct Faculty and Limited Join Appointments" property="og:description"/>
<meta content="https://web.uri.edu/cs/wp-content/themes/uri-modern/images/logo-wordmark.png" property="og:image"/>
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-K5GL9W');</script>
<style id="wp-custom-css" type="text/css">
.button-list .cl-button {
margin-bottom: 1rem;
}
#calendar .date,#calendar-wrap header {
text-align:center
}
#calendar {
width:100%
}
#calendar a {
color:#005eff;
text-decoration:none
}
#calendar ul {
list-style:none;
padding:0;
margin:0;
width:100%
}
#calendar li {
display:block;
float:left;
width:14.342%;
padding:5px;
box-sizing:border-box;
border:1px solid #ccc;
margin-right:-1px;
margin-bottom:-1px
}
#calendar ul.weekdays {
height:40px;
background:#002147
}
#calendar ul.weekdays li {
text-align:center;
text-transform:uppercase;
line-height:1.2;
border:none!important;
padding:.75rem .5rem;
color:#fff;
font-size:.9rem
}
#calendar ul.days.mobile {
display:none
}
#calendar .days li {
height:15rem
}
#calendar .days.events-zero li {
height:10rem
}
#calendar .days.events-one li {
height:10.75rem
}
#calendar .days.events-two li {
height:11.5rem
}
#calendar .days.events-three li {
height:15rem
}
#calendar .date {
margin-bottom:5px;
padding:4px;
color:#000;
padding-right: 1rem;
float:right;
}
#calendar .event {
clear:both;
display:block;
font-size: 1rem;
font-family: hind,arial,sans-serif;
border-radius:30px;
padding:.4rem .25rem .25rem 5rem;
margin-top:5px;
margin-bottom:5px;
line-height:1.75;
background:#e4f2f2;
text-decoration:none;
float:left;
position:relative;
width:calc(100% * 4.68)
}
#calendar .event.four-day{
width:calc(76% * 4.68)
}
#calendar .event.mobile {
display:none
}
#calendar .event.scratch {
background:#E2D58B;
}
#calendar .event.lego {
background:#E1EDE8;
}
#calendar .event.datacience {
background:#FCB97D;
}
#calendar .event.girlstech {
background:#C2CFB2;
}
#calendar .event.games {
background:#F79365;
}
#calendar .event.programming {
background:#BCDCE0;
}
#calendar .event.webdesign {
background:#E09FA2;
}
#calendar .event-desc {
color:#666;
margin:3px 0 7px;
text-decoration:none;
display:inline-block
}
#calendar .event-time {
margin:3px 0 7px 5px;
text-decoration:none;
display:inline-block
}
#calendar .other-month {
background:#f5f5f5;
color:#666
}
#desc {
display:none;
background:#eee;
box-shadow: 0 0 4px #999;
padding:10px;
color: #000;
}
#calendar .event-desc:hover+#desc {
display:block;
position:absolute;
z-index:2
}
.days+header h1 {
padding-top:2rem;
clear: left
}
@media(max-width:768px) {
#calendar .event img,#calendar .other-month,#calendar .weekdays {
display:none
}
#calendar .event {
width:calc(100% - 2em);
padding-left:20px;
padding-right:10px
}
#calendar .event.mobile,#calendar ul.days.mobile {
display:block
}
#calendar li {
height:auto!important;
border:1px solid #ededed;
width:100%;
padding:10px;
margin-bottom:-1px
}
#calendar .date {
float:none
}
}
.peopleitem.has-thumbnail img {
width: 200px;
}
</style>
<!-- Favicons -->
<link color="#005eff" href="https://web.uri.edu/cs/wp-content/themes/uri-modern/images/safari-pinned-tab.svg" rel="mask-icon"/>
<link href="https://web.uri.edu/cs/wp-content/themes/uri-modern/images/favicon.png" rel="icon" type="image/png"/>
<link href="https://web.uri.edu/cs/wp-content/themes/uri-modern/images/apple-touch-icon.png" rel="apple-touch-icon"/>
<link href="https://web.uri.edu/cs/wp-content/themes/uri-modern/images/apple-touch-icon-180x180.png" rel="apple-touch-icon" sizes="180x180"/>
</meta></link></meta></head>
<body class="page-template-default page page-id-629 page-parent group-blog ln-people">
<noscript><iframe height="0" src="https://www.googletagmanager.com/ns.html?id=GTM-K5GL9W" style="display:none;visibility:hidden" width="0"></iframe></noscript>
<div class="site" id="page">
<a class="skip-link screen-reader-text" href="#content">Skip to content</a>
<div id="masthead">
<header class="site-header" id="brandbar" role="banner">
<div id="identity-print"><img alt="University of Rhode Island" src="https://web.uri.edu/cs/wp-content/themes/uri-modern/images/logo-print.png" width="120px"/></div>
<div id="globalsearch" role="search">
<input aria-label="Toggle visibility of the search box." id="gsform-toggle" role="presentation" type="checkbox"/>
<label for="gsform-toggle" id="gsform"><span>Search</span></label>
<form action="https://www.uri.edu/search" id="gs" method="get" name="global_general_search_form">
<input name="cx" type="hidden" value="016863979916529535900:17qai8akniu">
<input name="cof" type="hidden" value="FORID:11"/>
<label for="gs-query" id="gs-query-label">Searchbox</label>
<input id="gs-query" name="q" placeholder="Search" role="searchbox" type="text" value=""/>
<input class="searchsubmit" id="gs-submit" name="searchsubmit" type="submit" value="Search"/>
</input></form>
</div>
<div id="globalbanner-wrapper">
<div id="globalbanner">
<a href="https://www.uri.edu/" title="University of Rhode Island"><div id="identity">University of Rhode Island</div></a>
<div id="gateways">
<input aria-label="Open the audience gateways menu when browsing on mobile" id="gateways-toggle" role="presentation" type="checkbox"/>
<label for="gateways-toggle" id="gateways-label"><span>You</span></label>
<ul id="gateways-menu" role="menu">
<li><a href="https://www.uri.edu/gateway/future-students" role="menuitem">Future Students</a></li>
<li><a href="https://www.uri.edu/gateway/students" role="menuitem">Students</a></li>
<li><a href="https://www.uri.edu/gateway/faculty" role="menuitem">Faculty</a></li>
<li><a href="https://www.uri.edu/gateway/staff" role="menuitem">Staff</a></li>
<li><a href="https://www.uri.edu/gateway/families" role="menuitem">Parents and Families</a></li>
<li><a href="https://www.uri.edu/gateway/alumni" role="menuitem">Alumni</a></li>
<li><a href="https://www.uri.edu/gateway/community" role="menuitem">Community</a></li>
</ul>
</div>
</div>
</div>
</header><!-- #brandbar -->
<header id="siteheader">
<div class="light" id="sitebanner">
<div id="sb-backdrop">
<div id="sb-background-image" style="background-image:url(https://web.uri.edu/wp-content/uploads/sites/1531/cropped-Big-Data.jpg)"></div>
<div id="sb-screen"></div>
</div>
<div id="sitebranding">
<div id="siteidentity">
<h1 class="site-title">
<a href="https://web.uri.edu/cs/" rel="home">
Department of Computer Science and Statistics </a>
</h1>
<h2 class="site-description">College of Arts and Sciences</h2>
</div>
<div id="sitesocial">
</div>
</div><!-- #sitebranding -->
</div><!-- #sitebanner -->
<div class="content-width" id="navigation">
<nav aria-label="Breadcrumb" id="breadcrumbs">
<ol><li><a href="https://www.uri.edu/">URI</a></li><li><a href="https://web.uri.edu/artsci">Arts and Sciences</a></li><li><a href="https://web.uri.edu/cs">Department of Computer Science and Statistics</a></li><li aria-current="page">People</li></ol></nav>
<div id="localnav">
<section class="cl-wrapper cl-menu-wrapper"><div class="cl-menu" data-name="Site Menu" data-show-title="0" id="cl-localnav"><ul class="cl-menu-list cl-menu-list-no-js" id="menu-navigation"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-8243" id="menu-item-8243"><a href="https://web.uri.edu/cs" title=" ">Home</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-8255" id="menu-item-8255"><a href="https://web.uri.edu/cs/about/" title=" ">About</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-8806" id="menu-item-8806"><a href="https://web.uri.edu/cs/academics/">Academics</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page current-menu-item page_item page-item-629 current_page_item menu-item-8257" id="menu-item-8257"><a aria-current="page" href="https://web.uri.edu/cs/people/" title=" ">People</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9661" id="menu-item-9661"><a href="https://web.uri.edu/cs/research/">Research</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-10871" id="menu-item-10871"><a href="https://web.uri.edu/cs/news-and-events/">News and Events</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-8267" id="menu-item-8267"><a href="https://web.uri.edu/cs/contact/" title=" ">Contact</a></li>
</ul></div></section></div>
</div>
</header>
</div>
<div class="site-content" id="content">
<main class="site-main" id="main" role="main">
<article class="post-629 page type-page status-publish hentry" id="post-629">
<div class="entry-content">
<h1>People</h1>
<section class="cl-wrapper cl-menu-wrapper"><div class="cl-menu" data-name="people" data-show-title="0" id=""><ul class="cl-menu-list cl-menu-list-no-js" id="menu-people"><li class="menu-item menu-item-type-post_type menu-item-object-page current-menu-item page_item page-item-629 current_page_item menu-item-8737" id="menu-item-8737"><a aria-current="page" href="https://web.uri.edu/cs/people/">Faculty</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-8746" id="menu-item-8746"><a href="https://web.uri.edu/cs/people/staff/">Staff</a></li>
<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-11844" id="menu-item-11844"><a href="https://web.uri.edu/cs/people/faculty-emeriti/">Faculty Emeriti</a></li>
</ul></div></section>
<h2>Full-time Faculty</h2>
<div class="uri-people-tool cl-tiles halves"><div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/marco-alvarez/"><img alt="" class="u-photo wp-post-image" height="120" loading="lazy" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/marco-alvarez.png" width="120"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/marco-alvarez/">Marco Alvarez</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Associate Professor | Director of Graduate Studies</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><span class="p-tel">401.874.5009</span> – <a class="u-email" href="mailto:malvarez@uri.edu">malvarez@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>
<div class="peopleitem h-card">
<header>
<div class="header">
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/samantha-armenti/">Samantha Armenti</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Assistant Teaching Professor</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><a class="u-email" href="mailto:sarmenti@uri.edu ">sarmenti@uri.edu </a></p>
<div style="clear:both;"></div>
</div>
</div>
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/sarah-brown/"><img alt="" class="u-photo wp-post-image" height="300" loading="lazy" sizes="(max-width: 300px) 100vw, 300px" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/Sarah-Brown.png" srcset="https://web.uri.edu/cs/wp-content/uploads/sites/1531/Sarah-Brown.png 300w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Sarah-Brown-150x150.png 150w" width="300"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/sarah-brown/">Sarah Brown</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Assistant Professor</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><a class="u-email" href="mailto:brownsarahm@uri.edu">brownsarahm@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/michael-conti/"><img alt="" class="u-photo wp-post-image" height="2475" loading="lazy" sizes="(max-width: 2560px) 100vw, 2560px" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/mike-conti-scaled.jpg" srcset="https://web.uri.edu/cs/wp-content/uploads/sites/1531/mike-conti-scaled.jpg 2560w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/mike-conti-300x290.jpg 300w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/mike-conti-1024x990.jpg 1024w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/mike-conti-768x743.jpg 768w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/mike-conti-1536x1485.jpg 1536w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/mike-conti-2048x1980.jpg 2048w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/mike-conti-364x352.jpg 364w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/mike-conti-500x483.jpg 500w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/mike-conti-1000x967.jpg 1000w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/mike-conti-1280x1238.jpg 1280w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/mike-conti-2000x1934.jpg 2000w" width="2560"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/michael-conti/">Michael Conti</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Assistant Teaching Professor</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><a class="u-email" href="mailto:michaelconti@uri.edu ">michaelconti@uri.edu </a></p>
<div style="clear:both;"></div>
</div>
</div>
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/noah-daniels/"><img alt="" class="u-photo wp-post-image" height="219" loading="lazy" sizes="(max-width: 219px) 100vw, 219px" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/noah-daniels-web.png" srcset="https://web.uri.edu/cs/wp-content/uploads/sites/1531/noah-daniels-web.png 219w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/noah-daniels-web-150x150.png 150w" width="219"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/noah-daniels/">Noah Daniels</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Assistant Professor</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><a class="u-email" href="mailto:noah_daniels@uri.edu">noah_daniels@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/lisa-dipippo/"><img alt="" class="u-photo wp-post-image" height="126" loading="lazy" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/lisa-dipippo-web.jpg" width="125"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/lisa-dipippo/">Lisa DiPippo</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Professor | Chair</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><a class="u-email" href="mailto:ldipippo@uri.edu">ldipippo@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/victor-fay-wolfe/"><img alt="" class="u-photo wp-post-image" height="125" loading="lazy" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/victor-fay-wolfe-web.jpg" width="125"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/victor-fay-wolfe/">Victor Fay-Wolfe</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Professor</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><a class="u-email" href="mailto:vfaywolfe@uri.edu">vfaywolfe@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>
<div class="peopleitem h-card">
<header>
<div class="header">
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/lutz-hamel/">Lutz Hamel</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Associate Professor </p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><a class="u-email" href="mailto:lutzhamel@uri.edu">lutzhamel@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/abdeltawab-hendawi/"><img alt="" class="u-photo wp-post-image" height="885" loading="lazy" sizes="(max-width: 1000px) 100vw, 1000px" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/0-1.jpeg" srcset="https://web.uri.edu/cs/wp-content/uploads/sites/1531/0-1.jpeg 1000w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/0-1-300x266.jpeg 300w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/0-1-768x680.jpeg 768w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/0-1-364x322.jpeg 364w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/0-1-500x443.jpeg 500w" width="1000"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/abdeltawab-hendawi/">Abdeltawab Hendawi</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Assistant Professor</p>
<p class="people-department">Data Science | Computer Science</p>
<p class="people-misc"><span class="p-tel">401.874.5738</span> – <a class="u-email" href="mailto:hendawi@uri.edu">hendawi@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/jean-yves-herve/"><img alt="" class="u-photo wp-post-image" height="299" loading="lazy" sizes="(max-width: 300px) 100vw, 300px" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/jean-yves-herve-web.jpg" srcset="https://web.uri.edu/cs/wp-content/uploads/sites/1531/jean-yves-herve-web.jpg 300w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/jean-yves-herve-web-150x150.jpg 150w" width="300"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/jean-yves-herve/">Jean-Yves Hervé</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Associate Professor</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><a class="u-email" href="mailto:jyh@cs.uri.edu">jyh@cs.uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/natallia-katenka/"><img alt="" class="u-photo wp-post-image" height="200" loading="lazy" sizes="(max-width: 200px) 100vw, 200px" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/natalia-katenka-web.jpg" srcset="https://web.uri.edu/cs/wp-content/uploads/sites/1531/natalia-katenka-web.jpg 200w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/natalia-katenka-web-150x150.jpg 150w" width="200"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/natallia-katenka/">Natallia Katenka</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Associate Professor | Director of Undergraduate Studies</p>
<p class="people-department">Statistics</p>
<p class="people-misc"><a class="u-email" href="mailto:nkatenka@uri.edu">nkatenka@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>
<div class="peopleitem h-card">
<header>
<div class="header">
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/soheyb-kouider/">Soheyb Kouider</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Associate Teaching Professor</p>
<p class="people-department">Statistics</p>
<p class="people-misc"><span class="p-tel">401.874.2562</span> – <a class="u-email" href="mailto:soheyb@uri.edu">soheyb@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/edmund-lamagna/"><img alt="" class="u-photo wp-post-image" height="150" loading="lazy" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/edmund-lamagna-web.jpg" width="150"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/edmund-lamagna/">Edmund Lamagna</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Professor</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><a class="u-email" href="mailto:eal@cs.uri.edu">eal@cs.uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/indrani-mandal/"><img alt="" class="u-photo wp-post-image" height="280" loading="lazy" sizes="(max-width: 278px) 100vw, 278px" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/0.jpeg" srcset="https://web.uri.edu/cs/wp-content/uploads/sites/1531/0.jpeg 278w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/0-150x150.jpeg 150w" width="278"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/indrani-mandal/">Indrani Mandal</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Assistant Teaching Professor</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><a class="u-email" href="mailto:indrani_mandal@uri.edu ">indrani_mandal@uri.edu </a></p>
<div style="clear:both;"></div>
</div>
</div>
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/gavino-puggioni/"><img alt="" class="u-photo wp-post-image" height="1600" loading="lazy" sizes="(max-width: 1600px) 100vw, 1600px" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/Gavino_headshot1-e1610666088381.jpg" srcset="https://web.uri.edu/cs/wp-content/uploads/sites/1531/Gavino_headshot1-e1610666088381.jpg 1600w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Gavino_headshot1-e1610666088381-300x300.jpg 300w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Gavino_headshot1-e1610666088381-1024x1024.jpg 1024w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Gavino_headshot1-e1610666088381-150x150.jpg 150w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Gavino_headshot1-e1610666088381-768x768.jpg 768w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Gavino_headshot1-e1610666088381-1536x1536.jpg 1536w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Gavino_headshot1-e1610666088381-364x364.jpg 364w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Gavino_headshot1-e1610666088381-500x500.jpg 500w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Gavino_headshot1-e1610666088381-1000x1000.jpg 1000w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Gavino_headshot1-e1610666088381-1280x1280.jpg 1280w" width="1600"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/gavino-puggioni/">Gavino Puggioni</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Associate Professor | Statistics Section Head | Director of Graduate Studies</p>
<p class="people-department">Statistics</p>
<p class="people-misc"><span class="p-tel">401.874.4388</span> – <a class="u-email" href="mailto:gpuggioni@uri.edu">gpuggioni@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>
<div class="peopleitem h-card">
<header>
<div class="header">
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/jonathan-schrader/">Jonathan Schrader</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Assistant Teaching Professor</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><a class="u-email" href="mailto:jonathan.schrader@uri.edu">jonathan.schrader@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/krishna-venkatasubramanian/"><img alt="" class="u-photo wp-post-image" height="2703" loading="lazy" sizes="(max-width: 2437px) 100vw, 2437px" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/KV_biopic_2.jpg" srcset="https://web.uri.edu/cs/wp-content/uploads/sites/1531/KV_biopic_2.jpg 2437w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/KV_biopic_2-270x300.jpg 270w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/KV_biopic_2-768x852.jpg 768w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/KV_biopic_2-923x1024.jpg 923w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/KV_biopic_2-364x404.jpg 364w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/KV_biopic_2-500x555.jpg 500w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/KV_biopic_2-1000x1109.jpg 1000w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/KV_biopic_2-1280x1420.jpg 1280w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/KV_biopic_2-2000x2218.jpg 2000w" width="2437"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/krishna-venkatasubramanian/">Krishna Venkatasubramanian</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Assistant Professor</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><a class="u-email" href="mailto:krish@uri.edu">krish@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/jing-wu/"><img alt="" class="u-photo wp-post-image" height="200" loading="lazy" sizes="(max-width: 200px) 100vw, 200px" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/jing-wu-web.jpg" srcset="https://web.uri.edu/cs/wp-content/uploads/sites/1531/jing-wu-web.jpg 200w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/jing-wu-web-150x150.jpg 150w" width="200"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/jing-wu/">Jing Wu</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Associate Professor</p>
<p class="people-department">Statistics</p>
<p class="people-misc"><span class="p-tel">401.874.4504</span> – <a class="u-email" href="mailto:jing_wu@uri.edu">jing_wu@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/yichi-zhang/"><img alt="" class="u-photo wp-post-image" height="240" loading="lazy" sizes="(max-width: 240px) 100vw, 240px" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/yichi-zhang-web.jpg" srcset="https://web.uri.edu/cs/wp-content/uploads/sites/1531/yichi-zhang-web.jpg 240w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/yichi-zhang-web-150x150.jpg 150w" width="240"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/yichi-zhang/">Yichi Zhang</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Assistant Professor </p>
<p class="people-department">Statistics</p>
<p class="people-misc"><a class="u-email" href="mailto:yichizhang@uri.edu">yichizhang@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/guangyu-zhu/"><img alt="" class="u-photo wp-post-image" height="200" loading="lazy" sizes="(max-width: 200px) 100vw, 200px" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/Guangyu-Zhu-web.jpg" srcset="https://web.uri.edu/cs/wp-content/uploads/sites/1531/Guangyu-Zhu-web.jpg 200w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Guangyu-Zhu-web-150x150.jpg 150w" width="200"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/guangyu-zhu/">Guangyu Zhu</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Assistant Professor</p>
<p class="people-department">Statistics</p>
<p class="people-misc"><a class="u-email" href="mailto:guangyuzhu@uri.edu">guangyuzhu@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>
</div>
<p>
<h2>Adjunct Faculty and Limited Join Appointments</h2>
</p>
<div class="uri-people-tool cl-tiles halves"><div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/ashley-buchanan/"><img alt="" class="u-photo wp-post-image" height="966" loading="lazy" sizes="(max-width: 966px) 100vw, 966px" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/Ashley-Buchanan.jpg" srcset="https://web.uri.edu/cs/wp-content/uploads/sites/1531/Ashley-Buchanan.jpg 966w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Ashley-Buchanan-300x300.jpg 300w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Ashley-Buchanan-150x150.jpg 150w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Ashley-Buchanan-768x768.jpg 768w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Ashley-Buchanan-364x364.jpg 364w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Ashley-Buchanan-500x500.jpg 500w" width="966"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/ashley-buchanan/">Ashley Buchanan</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Limited Joint Appointment</p>
<p class="people-department">Biostatistics</p>
<p class="people-misc"><span class="p-tel">401.874.4739</span> – <a class="u-email" href="mailto:buchanan@uri.edu">buchanan@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/nina-kajiji/"><img alt="" class="u-photo wp-post-image" height="125" loading="lazy" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/nina-kajiji-web.jpg" width="125"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/nina-kajiji/">Nina Kajiji</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Adjunct Associate Professor</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><a class="u-email" href="mailto:nina@uri.edu">nina@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/rachel-schwartz/"><img alt="" class="u-photo wp-post-image" height="120" loading="lazy" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/Rachel-Schwartz-web.jpg" width="120"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/rachel-schwartz/">Rachel Schwartz</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Assistant Professor – Limited Joint Appointment</p>
<p class="people-department">Biological Sciences</p>
<p class="people-misc"><span class="p-tel">401.874.5404</span> – <a class="u-email" href="mailto:rsschwartz@uri.edu">rsschwartz@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/ying-zhang/"><img alt="" class="u-photo wp-post-image" height="250" loading="lazy" sizes="(max-width: 249px) 100vw, 249px" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/ying-zhang-web.jpg" srcset="https://web.uri.edu/cs/wp-content/uploads/sites/1531/ying-zhang-web.jpg 249w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/ying-zhang-web-150x150.jpg 150w" width="249"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/ying-zhang/">Ying Zhang</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Assistant Professor – Limited Joint Appointment</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><span class="p-tel">401.874.4915</span> – <a class="u-email" href="mailto:yingzhang@uri.edu">yingzhang@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>
</div>
<p>
</p></div><!-- .entry-content -->
</article><!-- #post-## -->
</main><!-- #main -->
</div><!-- #content -->
<div id="actionbar-wrapper">
<div id="actionbar" role="menu">
<a href="https://www.uri.edu/connect/?utm_campaign=request-info&utm_source=action-bar&utm_medium=web" id="action-connect" role="menuitem"><span role="presentation" title="Learn more about URI: Get in touch"></span>Connect</a><a href="https://www.uri.edu/apply" id="action-apply" role="menuitem"><span role="presentation"></span>Apply</a><a href="https://www.uri.edu/tour" id="action-tour" role="menuitem"><span role="presentation"></span>Tour</a><a href="https://www.uri.edu/give" id="action-give" role="menuitem"><span role="presentation"></span>Give</a> </div>
</div><!-- #actionbar-wrapper -->
<footer id="globalfooter">
<div id="basement">
<div id="storagebins">
<div id="sb-university">
<input checked="" id="sb-university-toggle" name="storagebin" role="presentation" type="radio" value="university"/>
<label aria-label="Open the University footer menu when browsing on mobile." for="sb-university-toggle"><span>University</span></label>
<ul aria-label="The University footer menu." role="menu">
<li><a href="https://www.uri.edu/about/leadership/" role="menuitem">Leadership</a></li>
<li><a href="https://web.uri.edu/diversity/" role="menuitem">Diversity and Inclusion</a></li>
<li><a href="https://web.uri.edu/global/" role="menuitem">Global</a></li>
<li><a href="https://www.uri.edu/about/campuses/" role="menuitem">Campuses</a></li>
<li><a href="https://www.uri.edu/safety/" role="menuitem">Safety</a></li>
</ul>
</div>
<div id="sb-campus-life">
<input id="sb-campus-life-toggle" name="storagebin" role="presentation" type="radio" value="campus-life"/>
<label aria-label="Open the Campus Life footer menu when browsing on mobile." for="sb-campus-life-toggle"><span>Campus Life</span></label>
<ul aria-label="The Campus Life footer menu." role="menu">
<li><a href="https://web.uri.edu/housing/" role="menuitem">Housing</a></li>
<li><a href="https://web.uri.edu/dining/" role="menuitem">Dining</a></li>
<li><a href="https://www.uri.edu/athletics/" role="menuitem">Athletics and Recreation</a></li>
<li><a href="https://www.uri.edu/campus-life/health-and-wellness/" role="menuitem">Health and Wellness</a></li>
<li><a href="https://events.uri.edu" role="menuitem">Events</a></li>
</ul>
</div>
<div id="sb-academics">
<input id="sb-academics-toggle" name="storagebin" role="presentation" type="radio" value="academics"/>
<label aria-label="Open the Academics footer menu when browsing on mobile." for="sb-academics-toggle"><span>Academics</span></label>
<ul aria-label="The Academics footer menu." role="menu">
<li><a href="https://www.uri.edu/academics/" role="menuitem">Undergraduate</a></li>
<li><a href="https://web.uri.edu/graduate-school/" role="menuitem">Graduate</a></li>
<li><a href="https://web.uri.edu/advising/" role="menuitem">Advising</a></li>
<li><a href="https://web.uri.edu/library/" role="menuitem">Libraries</a></li>
<li><a href="https://web.uri.edu/career/students/" role="menuitem">Internships</a></li>
</ul>
</div>
</div>
<div id="gimmicks">
<!-- Tides Widget -->
<div class="uri-tides-widget darkmode" data-height="22"><span class="status"></span></div>
<hr/>
<!-- Social Media Component -->
<aside class="cl-wrapper cl-social-wrapper"><ul class="cl-social light"><li><a class="cl-social-facebook" href="https://www.facebook.com/universityofri" title="Facebook">Facebook</a></li><li><a class="cl-social-instagram" href="https://www.instagram.com/universityofri/" title="Instagram">Instagram</a></li><li><a class="cl-social-twitter" href="https://twitter.com/universityofri" title="Twitter">Twitter</a></li><li><a class="cl-social-youtube" href="https://www.youtube.com/user/UniversityOfRI" title="YouTube">YouTube</a></li></ul></aside> </div>
</div>
<div id="tagline"></div>
<div id="legal">
<p>Copyright © <a class="subtle" href="http://www.uri.edu/">University of Rhode Island</a> | University of Rhode Island, Kingston, RI 02881, USA | 1.401.874.1000</p>
<p>URI is an equal opportunity employer committed to the principles of affirmative action. <a class="jobs" href="https://jobs.uri.edu/">Work at URI</a></p>
</div>
</footer><!-- #globalfooter -->
</div><!-- #page -->
<script id="uricl-js-js" src="https://web.uri.edu/cs/wp-content/plugins/uri-component-library/js/cl.built.js?ver=20230421" type="text/javascript"></script>
<script id="uri-tides-js-extra" type="text/javascript">
/* <![CDATA[ */
var tides = {"temperature":{"metadata":{"id":"8454049","name":"Quonset Point","lat":"41.5868","lon":"-71.4110"},"data":[{"t":"2023-04-21 00:36","v":"50.9","f":"0,0,0"}]},"tide":{"predictions":[{"t":"2023-04-20 00:25","v":"4.786","type":"H"},{"t":"2023-04-20 06:19","v":"-0.471","type":"L"},{"t":"2023-04-20 12:50","v":"4.140","type":"H"},{"t":"2023-04-20 18:03","v":"-0.437","type":"L"},{"t":"2023-04-21 01:10","v":"4.741","type":"H"},{"t":"2023-04-21 07:01","v":"-0.416","type":"L"},{"t":"2023-04-21 13:36","v":"3.969","type":"H"},{"t":"2023-04-21 18:42","v":"-0.346","type":"L"},{"t":"2023-04-22 01:55","v":"4.541","type":"H"},{"t":"2023-04-22 07:41","v":"-0.280","type":"L"},{"t":"2023-04-22 14:22","v":"3.734","type":"H"},{"t":"2023-04-22 19:22","v":"-0.195","type":"L"},{"t":"2023-04-23 02:40","v":"4.228","type":"H"},{"t":"2023-04-23 08:19","v":"-0.075","type":"L"},{"t":"2023-04-23 15:08","v":"3.475","type":"H"},{"t":"2023-04-23 20:04","v":"-0.001","type":"L"}]},"date":"1682037984","expires_on":"1682038284"};
/* ]]> */
</script>
<script id="uri-tides-js" src="https://web.uri.edu/cs/wp-content/plugins/uri-tides/js/tides.js?ver=2.1.0" type="text/javascript"></script>
<script id="wp-jquery-lightbox-js-extra" type="text/javascript">
/* <![CDATA[ */
var JQLBSettings = {"fitToScreen":"0","resizeSpeed":"400","displayDownloadLink":"0","navbarOnTop":"0","loopImages":"","resizeCenter":"","marginSize":"","linkTarget":"","help":"","prevLinkTitle":"previous image","nextLinkTitle":"next image","prevLinkText":"\u00ab Previous","nextLinkText":"Next \u00bb","closeTitle":"close image gallery","image":"Image ","of":" of ","download":"Download","jqlb_overlay_opacity":"80","jqlb_overlay_color":"#000000","jqlb_overlay_close":"1","jqlb_border_width":"10","jqlb_border_color":"#ffffff","jqlb_border_radius":"0","jqlb_image_info_background_transparency":"100","jqlb_image_info_bg_color":"#ffffff","jqlb_image_info_text_color":"#000000","jqlb_image_info_text_fontsize":"10","jqlb_show_text_for_image":"1","jqlb_next_image_title":"next image","jqlb_previous_image_title":"previous image","jqlb_next_button_image":"https:\/\/web.uri.edu\/cs\/wp-content\/plugins\/wp-lightbox-2\/styles\/images\/next.gif","jqlb_previous_button_image":"https:\/\/web.uri.edu\/cs\/wp-content\/plugins\/wp-lightbox-2\/styles\/images\/prev.gif","jqlb_maximum_width":"","jqlb_maximum_height":"","jqlb_show_close_button":"1","jqlb_close_image_title":"close image gallery","jqlb_close_image_max_heght":"22","jqlb_image_for_close_lightbox":"https:\/\/web.uri.edu\/cs\/wp-content\/plugins\/wp-lightbox-2\/styles\/images\/closelabel.gif","jqlb_keyboard_navigation":"1","jqlb_popup_size_fix":"0"};
/* ]]> */
</script>
<script id="wp-jquery-lightbox-js" src="https://web.uri.edu/cs/wp-content/plugins/wp-lightbox-2/js/dist/wp-lightbox-2.min.js?ver=1.3.4.1" type="text/javascript"></script>
<script id="uri-modern-navigation-js" src="https://web.uri.edu/cs/wp-content/themes/uri-modern/js/navigation.js?ver=2.5.0" type="text/javascript"></script>
<script id="uri-modern-smoothscroll-js" src="https://web.uri.edu/cs/wp-content/themes/uri-modern/js/smoothscroll.min.js?ver=2.5.0" type="text/javascript"></script>
<script id="uri-modern-skip-link-focus-fix-js" src="https://web.uri.edu/cs/wp-content/themes/uri-modern/js/skip-link-focus-fix.js?ver=2.5.0" type="text/javascript"></script>
<script id="uri-modern-scripts-js-extra" type="text/javascript">
/* <![CDATA[ */
var URIMODERN = {"base":"https:\/\/web.uri.edu\/cs","path":{"page":"https:\/\/web.uri.edu\/cs\/people\/","theme":"https:\/\/web.uri.edu\/cs\/wp-content\/themes\/uri-modern","themes":"https:\/\/web.uri.edu\/cs\/wp-content\/themes","plugins":"https:\/\/web.uri.edu\/cs\/wp-content\/plugins"},"theme":{"name":"URI Modern","version":"2.5.0","textDomain":"uri"},"is":{"404":false,"childTheme":false,"admin":false},"features":[]};
/* ]]> */
</script>
<script id="uri-modern-scripts-js" src="https://web.uri.edu/cs/wp-content/themes/uri-modern/js/script.min.js?ver=2.5.0" type="text/javascript"></script>
<script id="page-links-to-js" src="https://web.uri.edu/cs/wp-content/plugins/page-links-to/dist/new-tab.js?ver=3.3.5" type="text/javascript"></script>
<script id="wp-embed-js" src="https://web.uri.edu/cs/wp-includes/js/wp-embed.min.js?ver=5.7.1" type="text/javascript"></script>
<!--
#################################### ####################################
#################################### #|================================|#
################VoV################# #|___ ___ __ ___ __ |#
###############/ _ \################ #| | |_| | |\ | |/ |_) | /__ |#
###############V==)/\############### #| | | | _|_ | \| |\ |_) _|_ \_| |#
##############/=/ ||=|############## #| _ _ _ |#
########o(___/=/ _______)o######### #| \ / |_ | \ / \ |#
############/=/#| |=/############### #| \/\/ |_ |_/ \_/ |#
############|=|#| |################# #| |#
#############\=\| |################# #| .~~~~~~. |#
##############A=| |################# #| ~~~~######~~ |#
######o#########| |\########o####### #| ~~~~########~~ |#
######|````A####| |=\##A````|####### #| ~~~~~#######~~ |#
######| _ \####V \=\##/ _ |####### #| ~~~~~###~~#~~~ |#
######A/#s `s==\___/=/s` s#\A####### #| ~~~~~##~~~~~ |#
##########s. `\=====/ .s########### #|___________`-~~~~#~-`___________|#
###########|'.__```__.'############# #|############_-====-_ ###########|#
###########|=|###`################## #|##########/` . `\##########|#
############\_\##################### #|#########/ {-||-} \#########|#
##############V##################### #|#########( --||-- )#########|#
####|``|############################ #|#########\ =\\-\/-//= /#########|#
####| | \V/ _ \\____ \V/ __ \#### #|##########\. ==== ./##########|#
####| Y | (_) | |_) | ___/#### #|###########`-______-`###########|#
####|___|__/\____/| ___/A\____)#### #|################################|#
##################|_|############### #|################################|#
#################################### ####################################
|==================================| |==================================|
|` `| |` `|
| THE STATE OF RHODE ISLAND | | THE UNIVERSITY OF RHODE ISLAND |
| ~ 1636 ~ | | ~ 1892 ~ |
|. .| |. .|
|==================================| |==================================|
#################################### ####################################
-->
<script type="text/javascript">window.NREUM||(NREUM={});NREUM.info={"beacon":"bam.nr-data.net","licenseKey":"NRJS-efb76a2da79a549a60d","applicationID":"1015449156","transactionName":"MVRUMkMAVxdWV0daCwgedwVFCFYKGERSVAE=","queueTime":0,"applicationTime":405,"atts":"HRNXRAsaRBk=","errorBeacon":"bam.nr-data.net","agent":""}</script></body>
</html>
10.3.2. Searching the source#
More helpful is the find_all
method we wnat to find all div
tags that are “peopleitem” class. We decided this by inspecting the code on the website.
cs_people.find_all('div','peopleitem')
Show code cell output
[<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/marco-alvarez/"><img alt="" class="u-photo wp-post-image" height="120" loading="lazy" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/marco-alvarez.png" width="120"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/marco-alvarez/">Marco Alvarez</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Associate Professor | Director of Graduate Studies</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><span class="p-tel">401.874.5009</span> – <a class="u-email" href="mailto:malvarez@uri.edu">malvarez@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>,
<div class="peopleitem h-card">
<header>
<div class="header">
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/samantha-armenti/">Samantha Armenti</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Assistant Teaching Professor</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><a class="u-email" href="mailto:sarmenti@uri.edu ">sarmenti@uri.edu </a></p>
<div style="clear:both;"></div>
</div>
</div>,
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/sarah-brown/"><img alt="" class="u-photo wp-post-image" height="300" loading="lazy" sizes="(max-width: 300px) 100vw, 300px" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/Sarah-Brown.png" srcset="https://web.uri.edu/cs/wp-content/uploads/sites/1531/Sarah-Brown.png 300w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Sarah-Brown-150x150.png 150w" width="300"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/sarah-brown/">Sarah Brown</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Assistant Professor</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><a class="u-email" href="mailto:brownsarahm@uri.edu">brownsarahm@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>,
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/michael-conti/"><img alt="" class="u-photo wp-post-image" height="2475" loading="lazy" sizes="(max-width: 2560px) 100vw, 2560px" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/mike-conti-scaled.jpg" srcset="https://web.uri.edu/cs/wp-content/uploads/sites/1531/mike-conti-scaled.jpg 2560w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/mike-conti-300x290.jpg 300w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/mike-conti-1024x990.jpg 1024w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/mike-conti-768x743.jpg 768w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/mike-conti-1536x1485.jpg 1536w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/mike-conti-2048x1980.jpg 2048w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/mike-conti-364x352.jpg 364w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/mike-conti-500x483.jpg 500w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/mike-conti-1000x967.jpg 1000w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/mike-conti-1280x1238.jpg 1280w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/mike-conti-2000x1934.jpg 2000w" width="2560"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/michael-conti/">Michael Conti</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Assistant Teaching Professor</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><a class="u-email" href="mailto:michaelconti@uri.edu ">michaelconti@uri.edu </a></p>
<div style="clear:both;"></div>
</div>
</div>,
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/noah-daniels/"><img alt="" class="u-photo wp-post-image" height="219" loading="lazy" sizes="(max-width: 219px) 100vw, 219px" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/noah-daniels-web.png" srcset="https://web.uri.edu/cs/wp-content/uploads/sites/1531/noah-daniels-web.png 219w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/noah-daniels-web-150x150.png 150w" width="219"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/noah-daniels/">Noah Daniels</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Assistant Professor</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><a class="u-email" href="mailto:noah_daniels@uri.edu">noah_daniels@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>,
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/lisa-dipippo/"><img alt="" class="u-photo wp-post-image" height="126" loading="lazy" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/lisa-dipippo-web.jpg" width="125"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/lisa-dipippo/">Lisa DiPippo</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Professor | Chair</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><a class="u-email" href="mailto:ldipippo@uri.edu">ldipippo@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>,
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/victor-fay-wolfe/"><img alt="" class="u-photo wp-post-image" height="125" loading="lazy" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/victor-fay-wolfe-web.jpg" width="125"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/victor-fay-wolfe/">Victor Fay-Wolfe</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Professor</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><a class="u-email" href="mailto:vfaywolfe@uri.edu">vfaywolfe@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>,
<div class="peopleitem h-card">
<header>
<div class="header">
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/lutz-hamel/">Lutz Hamel</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Associate Professor </p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><a class="u-email" href="mailto:lutzhamel@uri.edu">lutzhamel@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>,
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/abdeltawab-hendawi/"><img alt="" class="u-photo wp-post-image" height="885" loading="lazy" sizes="(max-width: 1000px) 100vw, 1000px" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/0-1.jpeg" srcset="https://web.uri.edu/cs/wp-content/uploads/sites/1531/0-1.jpeg 1000w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/0-1-300x266.jpeg 300w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/0-1-768x680.jpeg 768w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/0-1-364x322.jpeg 364w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/0-1-500x443.jpeg 500w" width="1000"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/abdeltawab-hendawi/">Abdeltawab Hendawi</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Assistant Professor</p>
<p class="people-department">Data Science | Computer Science</p>
<p class="people-misc"><span class="p-tel">401.874.5738</span> – <a class="u-email" href="mailto:hendawi@uri.edu">hendawi@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>,
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/jean-yves-herve/"><img alt="" class="u-photo wp-post-image" height="299" loading="lazy" sizes="(max-width: 300px) 100vw, 300px" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/jean-yves-herve-web.jpg" srcset="https://web.uri.edu/cs/wp-content/uploads/sites/1531/jean-yves-herve-web.jpg 300w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/jean-yves-herve-web-150x150.jpg 150w" width="300"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/jean-yves-herve/">Jean-Yves Hervé</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Associate Professor</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><a class="u-email" href="mailto:jyh@cs.uri.edu">jyh@cs.uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>,
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/natallia-katenka/"><img alt="" class="u-photo wp-post-image" height="200" loading="lazy" sizes="(max-width: 200px) 100vw, 200px" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/natalia-katenka-web.jpg" srcset="https://web.uri.edu/cs/wp-content/uploads/sites/1531/natalia-katenka-web.jpg 200w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/natalia-katenka-web-150x150.jpg 150w" width="200"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/natallia-katenka/">Natallia Katenka</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Associate Professor | Director of Undergraduate Studies</p>
<p class="people-department">Statistics</p>
<p class="people-misc"><a class="u-email" href="mailto:nkatenka@uri.edu">nkatenka@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>,
<div class="peopleitem h-card">
<header>
<div class="header">
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/soheyb-kouider/">Soheyb Kouider</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Associate Teaching Professor</p>
<p class="people-department">Statistics</p>
<p class="people-misc"><span class="p-tel">401.874.2562</span> – <a class="u-email" href="mailto:soheyb@uri.edu">soheyb@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>,
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/edmund-lamagna/"><img alt="" class="u-photo wp-post-image" height="150" loading="lazy" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/edmund-lamagna-web.jpg" width="150"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/edmund-lamagna/">Edmund Lamagna</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Professor</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><a class="u-email" href="mailto:eal@cs.uri.edu">eal@cs.uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>,
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/indrani-mandal/"><img alt="" class="u-photo wp-post-image" height="280" loading="lazy" sizes="(max-width: 278px) 100vw, 278px" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/0.jpeg" srcset="https://web.uri.edu/cs/wp-content/uploads/sites/1531/0.jpeg 278w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/0-150x150.jpeg 150w" width="278"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/indrani-mandal/">Indrani Mandal</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Assistant Teaching Professor</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><a class="u-email" href="mailto:indrani_mandal@uri.edu ">indrani_mandal@uri.edu </a></p>
<div style="clear:both;"></div>
</div>
</div>,
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/gavino-puggioni/"><img alt="" class="u-photo wp-post-image" height="1600" loading="lazy" sizes="(max-width: 1600px) 100vw, 1600px" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/Gavino_headshot1-e1610666088381.jpg" srcset="https://web.uri.edu/cs/wp-content/uploads/sites/1531/Gavino_headshot1-e1610666088381.jpg 1600w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Gavino_headshot1-e1610666088381-300x300.jpg 300w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Gavino_headshot1-e1610666088381-1024x1024.jpg 1024w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Gavino_headshot1-e1610666088381-150x150.jpg 150w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Gavino_headshot1-e1610666088381-768x768.jpg 768w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Gavino_headshot1-e1610666088381-1536x1536.jpg 1536w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Gavino_headshot1-e1610666088381-364x364.jpg 364w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Gavino_headshot1-e1610666088381-500x500.jpg 500w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Gavino_headshot1-e1610666088381-1000x1000.jpg 1000w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Gavino_headshot1-e1610666088381-1280x1280.jpg 1280w" width="1600"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/gavino-puggioni/">Gavino Puggioni</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Associate Professor | Statistics Section Head | Director of Graduate Studies</p>
<p class="people-department">Statistics</p>
<p class="people-misc"><span class="p-tel">401.874.4388</span> – <a class="u-email" href="mailto:gpuggioni@uri.edu">gpuggioni@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>,
<div class="peopleitem h-card">
<header>
<div class="header">
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/jonathan-schrader/">Jonathan Schrader</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Assistant Teaching Professor</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><a class="u-email" href="mailto:jonathan.schrader@uri.edu">jonathan.schrader@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>,
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/krishna-venkatasubramanian/"><img alt="" class="u-photo wp-post-image" height="2703" loading="lazy" sizes="(max-width: 2437px) 100vw, 2437px" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/KV_biopic_2.jpg" srcset="https://web.uri.edu/cs/wp-content/uploads/sites/1531/KV_biopic_2.jpg 2437w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/KV_biopic_2-270x300.jpg 270w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/KV_biopic_2-768x852.jpg 768w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/KV_biopic_2-923x1024.jpg 923w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/KV_biopic_2-364x404.jpg 364w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/KV_biopic_2-500x555.jpg 500w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/KV_biopic_2-1000x1109.jpg 1000w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/KV_biopic_2-1280x1420.jpg 1280w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/KV_biopic_2-2000x2218.jpg 2000w" width="2437"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/krishna-venkatasubramanian/">Krishna Venkatasubramanian</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Assistant Professor</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><a class="u-email" href="mailto:krish@uri.edu">krish@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>,
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/jing-wu/"><img alt="" class="u-photo wp-post-image" height="200" loading="lazy" sizes="(max-width: 200px) 100vw, 200px" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/jing-wu-web.jpg" srcset="https://web.uri.edu/cs/wp-content/uploads/sites/1531/jing-wu-web.jpg 200w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/jing-wu-web-150x150.jpg 150w" width="200"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/jing-wu/">Jing Wu</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Associate Professor</p>
<p class="people-department">Statistics</p>
<p class="people-misc"><span class="p-tel">401.874.4504</span> – <a class="u-email" href="mailto:jing_wu@uri.edu">jing_wu@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>,
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/yichi-zhang/"><img alt="" class="u-photo wp-post-image" height="240" loading="lazy" sizes="(max-width: 240px) 100vw, 240px" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/yichi-zhang-web.jpg" srcset="https://web.uri.edu/cs/wp-content/uploads/sites/1531/yichi-zhang-web.jpg 240w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/yichi-zhang-web-150x150.jpg 150w" width="240"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/yichi-zhang/">Yichi Zhang</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Assistant Professor </p>
<p class="people-department">Statistics</p>
<p class="people-misc"><a class="u-email" href="mailto:yichizhang@uri.edu">yichizhang@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>,
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/guangyu-zhu/"><img alt="" class="u-photo wp-post-image" height="200" loading="lazy" sizes="(max-width: 200px) 100vw, 200px" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/Guangyu-Zhu-web.jpg" srcset="https://web.uri.edu/cs/wp-content/uploads/sites/1531/Guangyu-Zhu-web.jpg 200w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Guangyu-Zhu-web-150x150.jpg 150w" width="200"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/guangyu-zhu/">Guangyu Zhu</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Assistant Professor</p>
<p class="people-department">Statistics</p>
<p class="people-misc"><a class="u-email" href="mailto:guangyuzhu@uri.edu">guangyuzhu@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>,
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/ashley-buchanan/"><img alt="" class="u-photo wp-post-image" height="966" loading="lazy" sizes="(max-width: 966px) 100vw, 966px" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/Ashley-Buchanan.jpg" srcset="https://web.uri.edu/cs/wp-content/uploads/sites/1531/Ashley-Buchanan.jpg 966w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Ashley-Buchanan-300x300.jpg 300w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Ashley-Buchanan-150x150.jpg 150w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Ashley-Buchanan-768x768.jpg 768w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Ashley-Buchanan-364x364.jpg 364w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/Ashley-Buchanan-500x500.jpg 500w" width="966"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/ashley-buchanan/">Ashley Buchanan</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Limited Joint Appointment</p>
<p class="people-department">Biostatistics</p>
<p class="people-misc"><span class="p-tel">401.874.4739</span> – <a class="u-email" href="mailto:buchanan@uri.edu">buchanan@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>,
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/nina-kajiji/"><img alt="" class="u-photo wp-post-image" height="125" loading="lazy" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/nina-kajiji-web.jpg" width="125"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/nina-kajiji/">Nina Kajiji</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Adjunct Associate Professor</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><a class="u-email" href="mailto:nina@uri.edu">nina@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>,
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/rachel-schwartz/"><img alt="" class="u-photo wp-post-image" height="120" loading="lazy" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/Rachel-Schwartz-web.jpg" width="120"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/rachel-schwartz/">Rachel Schwartz</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Assistant Professor – Limited Joint Appointment</p>
<p class="people-department">Biological Sciences</p>
<p class="people-misc"><span class="p-tel">401.874.5404</span> – <a class="u-email" href="mailto:rsschwartz@uri.edu">rsschwartz@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>,
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/ying-zhang/"><img alt="" class="u-photo wp-post-image" height="250" loading="lazy" sizes="(max-width: 249px) 100vw, 249px" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/ying-zhang-web.jpg" srcset="https://web.uri.edu/cs/wp-content/uploads/sites/1531/ying-zhang-web.jpg 249w, https://web.uri.edu/cs/wp-content/uploads/sites/1531/ying-zhang-web-150x150.jpg 150w" width="249"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/ying-zhang/">Ying Zhang</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Assistant Professor – Limited Joint Appointment</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><span class="p-tel">401.874.4915</span> – <a class="u-email" href="mailto:yingzhang@uri.edu">yingzhang@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>]
this is a long, object and we can see it looks iterable ([
at the start)
people_items = cs_people.find_all('div','peopleitem')
len(people_items)
24
Important
answer to questions about searching from the docs
type(people_items)
bs4.element.ResultSet
We can also look at only the first instance
people_items[0]
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/marco-alvarez/"><img alt="" class="u-photo wp-post-image" height="120" loading="lazy" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/marco-alvarez.png" width="120"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/marco-alvarez/">Marco Alvarez</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Associate Professor | Director of Graduate Studies</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><span class="p-tel">401.874.5009</span> – <a class="u-email" href="mailto:malvarez@uri.edu">malvarez@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>
We notice that the name is inside a <h3>
tag with class p-name
and then inside an a tag after that. We also know from looking at the overall page that there are lots of other a tags, so we do not want to search all of those.
people_items[0].find('h3','p-name').a.string
'Marco Alvarez'
Then we can use a list comprehension to build alist of them.
names = [name.a.string for name in cs_people.find_all('h3','p-name')]
names
['Marco Alvarez',
'Samantha Armenti',
'Sarah Brown',
'Michael Conti',
'Noah Daniels',
'Lisa DiPippo',
'Victor Fay-Wolfe',
'Lutz Hamel',
'Abdeltawab Hendawi',
'Jean-Yves Hervé',
'Natallia Katenka',
'Soheyb Kouider',
'Edmund Lamagna',
'Indrani Mandal',
'Gavino Puggioni',
'Jonathan Schrader',
'Krishna Venkatasubramanian',
'Jing Wu',
'Yichi Zhang',
'Guangyu Zhu',
'Ashley Buchanan',
'Nina Kajiji',
'Rachel Schwartz',
'Ying Zhang']
people_items[0]
<div class="peopleitem h-card has-thumbnail">
<header>
<div class="header">
<figure>
<a href="https://web.uri.edu/cs/meet/marco-alvarez/"><img alt="" class="u-photo wp-post-image" height="120" loading="lazy" src="https://web.uri.edu/cs/wp-content/uploads/sites/1531/marco-alvarez.png" width="120"/></a>
</figure>
<h3 class="p-name"><a href="https://web.uri.edu/cs/meet/marco-alvarez/">Marco Alvarez</a></h3>
</div>
</header>
<div class="inside">
<p class="people-title p-job-title">Associate Professor | Director of Graduate Studies</p>
<p class="people-department">Computer Science</p>
<p class="people-misc"><span class="p-tel">401.874.5009</span> – <a class="u-email" href="mailto:malvarez@uri.edu">malvarez@uri.edu</a></p>
<div style="clear:both;"></div>
</div>
</div>
people_items[0].find('p','people-title').string
'Associate Professor | Director of Graduate Studies'
How to pull out the titles for each person (eg Assitatn Teaching Professor, Associate Professor)
titles = [t.string for t in cs_people.find_all("p","people-title")]
titles
['Associate Professor | Director of Graduate Studies',
'Assistant Teaching Professor',
'Assistant Professor',
'Assistant Teaching Professor',
'Assistant Professor',
'Professor | Chair',
'Professor',
'Associate Professor ',
'Assistant Professor',
'Associate Professor',
'Associate Professor | Director of Undergraduate Studies',
'Associate Teaching Professor',
'Professor',
'Assistant Teaching Professor',
'Associate Professor | Statistics Section Head | Director of Graduate Studies',
'Assistant Teaching Professor',
'Assistant Professor',
'Associate Professor',
'Assistant Professor ',
'Assistant Professor',
'Limited Joint Appointment',
'Adjunct Associate Professor',
'Assistant Professor – Limited Joint Appointment',
'Assistant Professor – Limited Joint Appointment']
on one item, the p
tag seems to work, but that is because the tag gives only the first instance,
people_items[0].find('p')
<p class="people-title p-job-title">Associate Professor | Director of Graduate Studies</p>
but we see if we ust this for all, it is way more informaiton than we were looking for.
[t.string for t in cs_people.find_all("p")]
['Associate Professor | Director of Graduate Studies',
'Computer Science',
None,
'Assistant Teaching Professor',
'Computer Science',
'sarmenti@uri.edu ',
'Assistant Professor',
'Computer Science',
'brownsarahm@uri.edu',
'Assistant Teaching Professor',
'Computer Science',
'michaelconti@uri.edu ',
'Assistant Professor',
'Computer Science',
'noah_daniels@uri.edu',
'Professor | Chair',
'Computer Science',
'ldipippo@uri.edu',
'Professor',
'Computer Science',
'vfaywolfe@uri.edu',
'Associate Professor ',
'Computer Science',
'lutzhamel@uri.edu',
'Assistant Professor',
'Data Science | Computer Science',
None,
'Associate Professor',
'Computer Science',
'jyh@cs.uri.edu',
'Associate Professor | Director of Undergraduate Studies',
'Statistics',
'nkatenka@uri.edu',
'Associate Teaching Professor',
'Statistics',
None,
'Professor',
'Computer Science',
'eal@cs.uri.edu',
'Assistant Teaching Professor',
'Computer Science',
'indrani_mandal@uri.edu ',
'Associate Professor | Statistics Section Head | Director of Graduate Studies',
'Statistics',
None,
'Assistant Teaching Professor',
'Computer Science',
'jonathan.schrader@uri.edu',
'Assistant Professor',
'Computer Science',
'krish@uri.edu',
'Associate Professor',
'Statistics',
None,
'Assistant Professor ',
'Statistics',
'yichizhang@uri.edu',
'Assistant Professor',
'Statistics',
'guangyuzhu@uri.edu',
None,
'Limited Joint Appointment',
'Biostatistics',
None,
'Adjunct Associate Professor',
'Computer Science',
'nina@uri.edu',
'Assistant Professor – Limited Joint Appointment',
'Biological Sciences',
None,
'Assistant Professor – Limited Joint Appointment',
'Computer Science',
None,
'\n',
None,
None]
We can pull out two more things, the people-department indicates who is CS & who is Statistics.
disciplines = [d.string for d in cs_people.find_all("p",'people-department')]
emails = [e.string for e in cs_people.find_all("a",'u-email')]
css_df = pd.DataFrame({'name':names, 'title':titles,'e-mails':emails, 'discipline':disciplines})
css_df.head()
name | title | e-mails | discipline | |
---|---|---|---|---|
0 | Marco Alvarez | Associate Professor | Director of Graduate Stu... | malvarez@uri.edu | Computer Science |
1 | Samantha Armenti | Assistant Teaching Professor | sarmenti@uri.edu | Computer Science |
2 | Sarah Brown | Assistant Professor | brownsarahm@uri.edu | Computer Science |
3 | Michael Conti | Assistant Teaching Professor | michaelconti@uri.edu | Computer Science |
4 | Noah Daniels | Assistant Professor | noah_daniels@uri.edu | Computer Science |
10.4. Crawling and scraping#
Remember we pulled the names out of links, when in the browser, we click on the links, we see that they are to a profile page. On these pages, they have the office number. Let’s add those to our dataframe.
First, we will do it for one person, then make a loop.
people_items[0].find('h3','p-name').a
<a href="https://web.uri.edu/cs/meet/marco-alvarez/">Marco Alvarez</a>
We see that the information that we want is in the href
attribute, to read that, we check the documentation. This tells us there is a .attrs
attribute of the python object we are working with.
people_items[0].find('h3','p-name').a.attrs
{'href': 'https://web.uri.edu/cs/meet/marco-alvarez/'}
It’s a dictionary and the attribute we want is the key we want. Nowe, we do the same thing we did above, request, pull the content from the response and then use the parser.
alvarez_url = people_items[0].find('h3','p-name').a.attrs['href']
alvarez_html = requests.get(alvarez_url).content
alvarez_info = BeautifulSoup(alvarez_html,'html.parser')
then we find the tag and class we need from inspecting and pull that.
alvarez_info.find_all('li','people-location')
[<li class="people-location"><strong>Office Location:</strong> Tyler 255</li>]
it’s an interable, so we pull the item out
alvarez_info.find_all('li','people-location')[0]
<li class="people-location"><strong>Office Location:</strong> Tyler 255</li>
Then we get the content.
alvarez_info.find_all('li','people-location')[0].string
this time this doesn’t work, so we can use the python __dict__
to inspect the object and see where it stored what we want.
alvarez_info.find_all('li','people-location')[0].__dict__
{'parser_class': bs4.BeautifulSoup,
'name': 'li',
'namespace': None,
'_namespaces': {},
'prefix': None,
'sourceline': 371,
'sourcepos': 329,
'known_xml': False,
'attrs': {'class': ['people-location']},
'contents': [<strong>Office Location:</strong>, ' Tyler 255'],
'parent': <ul class="people-list">
<li class="people-title">Associate Professor | Director of Graduate Studies</li> <li class="people-department">Computer Science</li> <li class="people-phone"><strong>Phone:</strong> 401.874.5009</li> <li class="people-email"><strong>Email:</strong> <a href="mailto:malvarez@uri.edu">malvarez@uri.edu</a></li> <li class="people-location"><strong>Office Location:</strong> Tyler 255</li> <li class="people-url"><strong>Website:</strong> <a href="http://homepage.cs.uri.edu/~malvarez/">http://homepage.cs.uri.edu/~malvarez/</a> </li></ul>,
'previous_element': ' ',
'next_element': <strong>Office Location:</strong>,
'next_sibling': ' ',
'previous_sibling': ' ',
'hidden': False,
'can_be_empty_element': False,
'cdata_list_attributes': {'*': ['class', 'accesskey', 'dropzone'],
'a': ['rel', 'rev'],
'link': ['rel', 'rev'],
'td': ['headers'],
'th': ['headers'],
'form': ['accept-charset'],
'object': ['archive'],
'area': ['rel'],
'icon': ['sizes'],
'iframe': ['sandbox'],
'output': ['for']},
'preserve_whitespace_tags': {'pre', 'textarea'},
'interesting_string_types': (bs4.element.NavigableString, bs4.element.CData)}
it’s the second elment of content
alvarez_info.find_all('li','people-location')[0].contents[1]
' Tyler 255'
Now tht we know how to do it, we can put it in a loop.
offices = []
for name_link in cs_people.find_all('h3','p-name'):
url = name_link.a.attrs['href']
person_html = requests.get(url).content
person_info = BeautifulSoup(person_html,'html.parser')
try:
offices.append(person_info.find_all('li','people-location')[0].contents[1])
except:
offices.append(pd.NA)
css_df['office'] = offices
We got an error at first, so we added the try
and except
to handle when there is no office location.
css_df.head()
name | title | e-mails | discipline | office | |
---|---|---|---|---|---|
0 | Marco Alvarez | Associate Professor | Director of Graduate Stu... | malvarez@uri.edu | Computer Science | Tyler 255 |
1 | Samantha Armenti | Assistant Teaching Professor | sarmenti@uri.edu | Computer Science | Tyler 129 |
2 | Sarah Brown | Assistant Professor | brownsarahm@uri.edu | Computer Science | Tyler 134 |
3 | Michael Conti | Assistant Teaching Professor | michaelconti@uri.edu | Computer Science | Tyler 137 |
4 | Noah Daniels | Assistant Professor | noah_daniels@uri.edu | Computer Science | Tyler 250 |
css_df.to_csv('css_faculty.csv')
10.5. Questions after class#
10.5.1. what does .a do?#
it gives the first instance of the <a>
tag
10.5.2. is it worth it to try and web scrape a page that is poorly written?#
If it is important information. In these cases, you might have to do more manual parsing or even some manual fixes.
For this class, no.
10.5.3. In theory, you could parse images and potentially their metadata with this method?#
This method could be a way to download images and the text that is around them, yes. This is how a lot of image datasets are built for machine learning.
10.5.4. Is API the website’s way of specify what information it will allow for you have?#
What we did today did not use any API. An API call would use the request library, and similar patterns to what we did, espeically the end of class. However and API call would typically respond with json, not html.
10.5.5. In the web-scraping of the offices, there were two strings, ‘CBLS 377’, and ‘CBLS Building 487’ how would we use pandas to normalize things like this?”#
We could use the replace
method that we used last week.