We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
MA: committee scraper for 2017
State: MA

says that it is skipping every page, I believe the site was rewritten and so will need a complete rewrite

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `openstates/ma/committees.py`
Content:
```
1 from billy.scrape.committees import CommitteeScraper, Committee
2 
3 import lxml.html
4 
5 
6 class MACommitteeScraper(CommitteeScraper):
7     jurisdiction = 'ma'
8 
9     def scrape(self, term, chambers):
10         page_types = []
11         if 'upper' in chambers:
12             page_types += ['Senate', 'Joint']
13         if 'lower' in chambers:
14             page_types += ['House']
15         chamber_mapping = {'Senate': 'upper',
16                            'House': 'lower',
17                            'Joint': 'joint'}
18 
19         foundComms = []
20 
21         for page_type in page_types:
22             url = 'http://www.malegislature.gov/Committees/' + page_type
23 
24             html = self.get(url, verify=False).text
25             doc = lxml.html.fromstring(html)
26             doc.make_links_absolute('http://www.malegislature.gov')
27 
28             for com_url in doc.xpath('//ul[@class="committeeList"]/li/a/@href'):
29                 chamber = chamber_mapping[page_type]
30                 self.scrape_committee(chamber, com_url)
31 
32     def scrape_committee(self, chamber, url):
33         html = self.get(url, verify=False).text
34         doc = lxml.html.fromstring(html)
35 
36         name = doc.xpath('//span[@class="committeeShortName"]/text()')
37         if len(name) == 0:
38             self.warning("Had to skip this malformed page.")
39             return
40         # Because of http://www.malegislature.gov/Committees/Senate/S29 this
41         # XXX: hack had to be pushed in. Remove me ASAP. This just skips
42         #      malformed pages.
43 
44         name = name[0]
45         com = Committee(chamber, name)
46         com.add_source(url)
47 
48         # get both titles and names, order is consistent
49         titles = doc.xpath('//p[@class="rankingMemberTitle"]/text()')
50         names = doc.xpath('//p[@class="rankingMemberName"]/a/text()')
51 
52         for title, name in zip(titles, names):
53             com.add_member(name, title)
54 
55         for member in doc.xpath('//div[@class="committeeRegularMembers"]//a/text()'):
56             com.add_member(member)
57 
58         if com['members']:
59             self.save_committee(com)
60
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/openstates/ma/committees.py b/openstates/ma/committees.py
--- a/openstates/ma/committees.py
+++ b/openstates/ma/committees.py
@@ -16,8 +16,6 @@
                            'House': 'lower',
                            'Joint': 'joint'}
 
-        foundComms = []
-
         for page_type in page_types:
             url = 'http://www.malegislature.gov/Committees/' + page_type
 
@@ -33,27 +31,15 @@
         html = self.get(url, verify=False).text
         doc = lxml.html.fromstring(html)
 
-        name = doc.xpath('//span[@class="committeeShortName"]/text()')
-        if len(name) == 0:
-            self.warning("Had to skip this malformed page.")
-            return
-        # Because of http://www.malegislature.gov/Committees/Senate/S29 this
-        # XXX: hack had to be pushed in. Remove me ASAP. This just skips
-        #      malformed pages.
-
-        name = name[0]
+        name = doc.xpath('//title/text()')[0]
         com = Committee(chamber, name)
         com.add_source(url)
 
-        # get both titles and names, order is consistent
-        titles = doc.xpath('//p[@class="rankingMemberTitle"]/text()')
-        names = doc.xpath('//p[@class="rankingMemberName"]/a/text()')
-
-        for title, name in zip(titles, names):
-            com.add_member(name, title)
-
-        for member in doc.xpath('//div[@class="committeeRegularMembers"]//a/text()'):
-            com.add_member(member)
+        members = doc.xpath('//a[contains(@href, "/Legislators/Profile")]')
+        for member in members:
+            title = member.xpath('../span')
+            role = title[0].text.lower() if title else 'member'
+            com.add_member(member.text, role)
 
         if com['members']:
             self.save_committee(com)

{"golden_diff": "diff --git a/openstates/ma/committees.py b/openstates/ma/committees.py\n--- a/openstates/ma/committees.py\n+++ b/openstates/ma/committees.py\n@@ -16,8 +16,6 @@\n                            'House': 'lower',\n                            'Joint': 'joint'}\n \n-        foundComms = []\n-\n         for page_type in page_types:\n             url = 'http://www.malegislature.gov/Committees/' + page_type\n \n@@ -33,27 +31,15 @@\n         html = self.get(url, verify=False).text\n         doc = lxml.html.fromstring(html)\n \n-        name = doc.xpath('//span[@class=\"committeeShortName\"]/text()')\n-        if len(name) == 0:\n-            self.warning(\"Had to skip this malformed page.\")\n-            return\n-        # Because of http://www.malegislature.gov/Committees/Senate/S29 this\n-        # XXX: hack had to be pushed in. Remove me ASAP. This just skips\n-        #      malformed pages.\n-\n-        name = name[0]\n+        name = doc.xpath('//title/text()')[0]\n         com = Committee(chamber, name)\n         com.add_source(url)\n \n-        # get both titles and names, order is consistent\n-        titles = doc.xpath('//p[@class=\"rankingMemberTitle\"]/text()')\n-        names = doc.xpath('//p[@class=\"rankingMemberName\"]/a/text()')\n-\n-        for title, name in zip(titles, names):\n-            com.add_member(name, title)\n-\n-        for member in doc.xpath('//div[@class=\"committeeRegularMembers\"]//a/text()'):\n-            com.add_member(member)\n+        members = doc.xpath('//a[contains(@href, \"/Legislators/Profile\")]')\n+        for member in members:\n+            title = member.xpath('../span')\n+            role = title[0].text.lower() if title else 'member'\n+            com.add_member(member.text, role)\n \n         if com['members']:\n             self.save_committee(com)\n", "issue": "MA: committee scraper for 2017\nState: MA\r\n\r\nsays that it is skipping every page, I believe the site was rewritten and so will need a complete rewrite\n", "before_files": [{"content": "from billy.scrape.committees import CommitteeScraper, Committee\n\nimport lxml.html\n\n\nclass MACommitteeScraper(CommitteeScraper):\n    jurisdiction = 'ma'\n\n    def scrape(self, term, chambers):\n        page_types = []\n        if 'upper' in chambers:\n            page_types += ['Senate', 'Joint']\n        if 'lower' in chambers:\n            page_types += ['House']\n        chamber_mapping = {'Senate': 'upper',\n                           'House': 'lower',\n                           'Joint': 'joint'}\n\n        foundComms = []\n\n        for page_type in page_types:\n            url = 'http://www.malegislature.gov/Committees/' + page_type\n\n            html = self.get(url, verify=False).text\n            doc = lxml.html.fromstring(html)\n            doc.make_links_absolute('http://www.malegislature.gov')\n\n            for com_url in doc.xpath('//ul[@class=\"committeeList\"]/li/a/@href'):\n                chamber = chamber_mapping[page_type]\n                self.scrape_committee(chamber, com_url)\n\n    def scrape_committee(self, chamber, url):\n        html = self.get(url, verify=False).text\n        doc = lxml.html.fromstring(html)\n\n        name = doc.xpath('//span[@class=\"committeeShortName\"]/text()')\n        if len(name) == 0:\n            self.warning(\"Had to skip this malformed page.\")\n            return\n        # Because of http://www.malegislature.gov/Committees/Senate/S29 this\n        # XXX: hack had to be pushed in. Remove me ASAP. This just skips\n        #      malformed pages.\n\n        name = name[0]\n        com = Committee(chamber, name)\n        com.add_source(url)\n\n        # get both titles and names, order is consistent\n        titles = doc.xpath('//p[@class=\"rankingMemberTitle\"]/text()')\n        names = doc.xpath('//p[@class=\"rankingMemberName\"]/a/text()')\n\n        for title, name in zip(titles, names):\n            com.add_member(name, title)\n\n        for member in doc.xpath('//div[@class=\"committeeRegularMembers\"]//a/text()'):\n            com.add_member(member)\n\n        if com['members']:\n            self.save_committee(com)\n", "path": "openstates/ma/committees.py"}], "after_files": [{"content": "from billy.scrape.committees import CommitteeScraper, Committee\n\nimport lxml.html\n\n\nclass MACommitteeScraper(CommitteeScraper):\n    jurisdiction = 'ma'\n\n    def scrape(self, term, chambers):\n        page_types = []\n        if 'upper' in chambers:\n            page_types += ['Senate', 'Joint']\n        if 'lower' in chambers:\n            page_types += ['House']\n        chamber_mapping = {'Senate': 'upper',\n                           'House': 'lower',\n                           'Joint': 'joint'}\n\n        for page_type in page_types:\n            url = 'http://www.malegislature.gov/Committees/' + page_type\n\n            html = self.get(url, verify=False).text\n            doc = lxml.html.fromstring(html)\n            doc.make_links_absolute('http://www.malegislature.gov')\n\n            for com_url in doc.xpath('//ul[@class=\"committeeList\"]/li/a/@href'):\n                chamber = chamber_mapping[page_type]\n                self.scrape_committee(chamber, com_url)\n\n    def scrape_committee(self, chamber, url):\n        html = self.get(url, verify=False).text\n        doc = lxml.html.fromstring(html)\n\n        name = doc.xpath('//title/text()')[0]\n        com = Committee(chamber, name)\n        com.add_source(url)\n\n        members = doc.xpath('//a[contains(@href, \"/Legislators/Profile\")]')\n        for member in members:\n            title = member.xpath('../span')\n            role = title[0].text.lower() if title else 'member'\n            com.add_member(member.text, role)\n\n        if com['members']:\n            self.save_committee(com)\n", "path": "openstates/ma/committees.py"}]}