prompt: 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()
  
  ```
  
golden_diff: 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)
  
verification_info: {"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"}]}