Ideal way of creating for loops using pyppeteer












1















I've written a script in python in combination with pyppeteer to scrape the names and its phone numbers of different coffe shops from a webpage. Although the way I tried below serves the purpose, the script looks real messy. What is the ideal way of creating for loops using pyppeteer library?



I've written so far:



import asyncio
from pyppeteer import launch

url = "https://www.yellowpages.com/search?search_terms=coffee&geo_location_terms=Los%20Angeles%2C%20CA"

async def get_names(link):
wb = await launch(headless=True)
page = await wb.newPage()
await page.goto(link)

containers = await page.querySelectorAll('div.v-card')
for container in containers:
name = await container.querySelector('.business-name span')
phone = await container.querySelector('.phones')
post = await page.evaluate('(element) => element.textContent', name)
postAno = await page.evaluate('(element) => element.textContent', phone)
print(f'{post}--{postAno}')

await wb.close()

asyncio.get_event_loop().run_until_complete(get_names(url))









share|improve this question



























    1















    I've written a script in python in combination with pyppeteer to scrape the names and its phone numbers of different coffe shops from a webpage. Although the way I tried below serves the purpose, the script looks real messy. What is the ideal way of creating for loops using pyppeteer library?



    I've written so far:



    import asyncio
    from pyppeteer import launch

    url = "https://www.yellowpages.com/search?search_terms=coffee&geo_location_terms=Los%20Angeles%2C%20CA"

    async def get_names(link):
    wb = await launch(headless=True)
    page = await wb.newPage()
    await page.goto(link)

    containers = await page.querySelectorAll('div.v-card')
    for container in containers:
    name = await container.querySelector('.business-name span')
    phone = await container.querySelector('.phones')
    post = await page.evaluate('(element) => element.textContent', name)
    postAno = await page.evaluate('(element) => element.textContent', phone)
    print(f'{post}--{postAno}')

    await wb.close()

    asyncio.get_event_loop().run_until_complete(get_names(url))









    share|improve this question

























      1












      1








      1








      I've written a script in python in combination with pyppeteer to scrape the names and its phone numbers of different coffe shops from a webpage. Although the way I tried below serves the purpose, the script looks real messy. What is the ideal way of creating for loops using pyppeteer library?



      I've written so far:



      import asyncio
      from pyppeteer import launch

      url = "https://www.yellowpages.com/search?search_terms=coffee&geo_location_terms=Los%20Angeles%2C%20CA"

      async def get_names(link):
      wb = await launch(headless=True)
      page = await wb.newPage()
      await page.goto(link)

      containers = await page.querySelectorAll('div.v-card')
      for container in containers:
      name = await container.querySelector('.business-name span')
      phone = await container.querySelector('.phones')
      post = await page.evaluate('(element) => element.textContent', name)
      postAno = await page.evaluate('(element) => element.textContent', phone)
      print(f'{post}--{postAno}')

      await wb.close()

      asyncio.get_event_loop().run_until_complete(get_names(url))









      share|improve this question














      I've written a script in python in combination with pyppeteer to scrape the names and its phone numbers of different coffe shops from a webpage. Although the way I tried below serves the purpose, the script looks real messy. What is the ideal way of creating for loops using pyppeteer library?



      I've written so far:



      import asyncio
      from pyppeteer import launch

      url = "https://www.yellowpages.com/search?search_terms=coffee&geo_location_terms=Los%20Angeles%2C%20CA"

      async def get_names(link):
      wb = await launch(headless=True)
      page = await wb.newPage()
      await page.goto(link)

      containers = await page.querySelectorAll('div.v-card')
      for container in containers:
      name = await container.querySelector('.business-name span')
      phone = await container.querySelector('.phones')
      post = await page.evaluate('(element) => element.textContent', name)
      postAno = await page.evaluate('(element) => element.textContent', phone)
      print(f'{post}--{postAno}')

      await wb.close()

      asyncio.get_event_loop().run_until_complete(get_names(url))






      python python-3.x web-scraping pyppeteer






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 26 '18 at 12:20









      robots.txtrobots.txt

      33815




      33815
























          2 Answers
          2






          active

          oldest

          votes


















          1














          I would do like this:



          import asyncio
          from pyppeteer import launch

          url = "https://www.yellowpages.com/search?search_terms=coffee&geo_location_terms=Los%20Angeles%2C%20CA"

          async def get_names(link):
          wb = await launch()
          page = await wb.newPage()
          await page.goto(link)

          containers = await page.querySelectorAll('div.v-card')
          for container in containers:
          name = await container.querySelectorEval('.business-name span','e => e.innerText')
          phone = await container.querySelectorEval('.phones','e => e.innerText')
          print(name,phone)

          asyncio.get_event_loop().run_until_complete(get_names(url))





          share|improve this answer































            0














            Try that:



            import asyncio
            from pyppeteer import launch

            url = "https://www.yellowpages.com/search?search_terms=coffee&geo_location_terms=Los%20Angeles%2C%20CA"

            async def get_names(link):
            wb = await launch(headless=True)
            page = await wb.newPage()
            await page.goto(link)

            names = await page.querySelectorAllEval('div.v-card .business-name span',
            '(elements => elements.map(e => e.textContent))')
            phones = await page.querySelectorAllEval('div.v-card .phones',
            '(elements => elements.map(e => e.textContent))')
            result = {name: phones[idx] for (idx, name) in enumerate(names)}
            print(result)
            await wb.close()

            asyncio.get_event_loop().run_until_complete(get_names(url))


            And read documentation: querySelectorAllEval






            share|improve this answer


























            • I'm getting this error name = await container.querySelectorAllEval('.business-name span', AttributeError: 'ElementHandle' object has no attribute 'querySelectorAllEval' @Nick when I execute your script.

              – robots.txt
              Nov 26 '18 at 12:55













            • @robots.txt try edited answer

              – Nick
              Nov 26 '18 at 12:59











            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53481018%2fideal-way-of-creating-for-loops-using-pyppeteer%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            2 Answers
            2






            active

            oldest

            votes








            2 Answers
            2






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            1














            I would do like this:



            import asyncio
            from pyppeteer import launch

            url = "https://www.yellowpages.com/search?search_terms=coffee&geo_location_terms=Los%20Angeles%2C%20CA"

            async def get_names(link):
            wb = await launch()
            page = await wb.newPage()
            await page.goto(link)

            containers = await page.querySelectorAll('div.v-card')
            for container in containers:
            name = await container.querySelectorEval('.business-name span','e => e.innerText')
            phone = await container.querySelectorEval('.phones','e => e.innerText')
            print(name,phone)

            asyncio.get_event_loop().run_until_complete(get_names(url))





            share|improve this answer




























              1














              I would do like this:



              import asyncio
              from pyppeteer import launch

              url = "https://www.yellowpages.com/search?search_terms=coffee&geo_location_terms=Los%20Angeles%2C%20CA"

              async def get_names(link):
              wb = await launch()
              page = await wb.newPage()
              await page.goto(link)

              containers = await page.querySelectorAll('div.v-card')
              for container in containers:
              name = await container.querySelectorEval('.business-name span','e => e.innerText')
              phone = await container.querySelectorEval('.phones','e => e.innerText')
              print(name,phone)

              asyncio.get_event_loop().run_until_complete(get_names(url))





              share|improve this answer


























                1












                1








                1







                I would do like this:



                import asyncio
                from pyppeteer import launch

                url = "https://www.yellowpages.com/search?search_terms=coffee&geo_location_terms=Los%20Angeles%2C%20CA"

                async def get_names(link):
                wb = await launch()
                page = await wb.newPage()
                await page.goto(link)

                containers = await page.querySelectorAll('div.v-card')
                for container in containers:
                name = await container.querySelectorEval('.business-name span','e => e.innerText')
                phone = await container.querySelectorEval('.phones','e => e.innerText')
                print(name,phone)

                asyncio.get_event_loop().run_until_complete(get_names(url))





                share|improve this answer













                I would do like this:



                import asyncio
                from pyppeteer import launch

                url = "https://www.yellowpages.com/search?search_terms=coffee&geo_location_terms=Los%20Angeles%2C%20CA"

                async def get_names(link):
                wb = await launch()
                page = await wb.newPage()
                await page.goto(link)

                containers = await page.querySelectorAll('div.v-card')
                for container in containers:
                name = await container.querySelectorEval('.business-name span','e => e.innerText')
                phone = await container.querySelectorEval('.phones','e => e.innerText')
                print(name,phone)

                asyncio.get_event_loop().run_until_complete(get_names(url))






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Dec 4 '18 at 21:24









                SIMSIM

                10.4k3743




                10.4k3743

























                    0














                    Try that:



                    import asyncio
                    from pyppeteer import launch

                    url = "https://www.yellowpages.com/search?search_terms=coffee&geo_location_terms=Los%20Angeles%2C%20CA"

                    async def get_names(link):
                    wb = await launch(headless=True)
                    page = await wb.newPage()
                    await page.goto(link)

                    names = await page.querySelectorAllEval('div.v-card .business-name span',
                    '(elements => elements.map(e => e.textContent))')
                    phones = await page.querySelectorAllEval('div.v-card .phones',
                    '(elements => elements.map(e => e.textContent))')
                    result = {name: phones[idx] for (idx, name) in enumerate(names)}
                    print(result)
                    await wb.close()

                    asyncio.get_event_loop().run_until_complete(get_names(url))


                    And read documentation: querySelectorAllEval






                    share|improve this answer


























                    • I'm getting this error name = await container.querySelectorAllEval('.business-name span', AttributeError: 'ElementHandle' object has no attribute 'querySelectorAllEval' @Nick when I execute your script.

                      – robots.txt
                      Nov 26 '18 at 12:55













                    • @robots.txt try edited answer

                      – Nick
                      Nov 26 '18 at 12:59
















                    0














                    Try that:



                    import asyncio
                    from pyppeteer import launch

                    url = "https://www.yellowpages.com/search?search_terms=coffee&geo_location_terms=Los%20Angeles%2C%20CA"

                    async def get_names(link):
                    wb = await launch(headless=True)
                    page = await wb.newPage()
                    await page.goto(link)

                    names = await page.querySelectorAllEval('div.v-card .business-name span',
                    '(elements => elements.map(e => e.textContent))')
                    phones = await page.querySelectorAllEval('div.v-card .phones',
                    '(elements => elements.map(e => e.textContent))')
                    result = {name: phones[idx] for (idx, name) in enumerate(names)}
                    print(result)
                    await wb.close()

                    asyncio.get_event_loop().run_until_complete(get_names(url))


                    And read documentation: querySelectorAllEval






                    share|improve this answer


























                    • I'm getting this error name = await container.querySelectorAllEval('.business-name span', AttributeError: 'ElementHandle' object has no attribute 'querySelectorAllEval' @Nick when I execute your script.

                      – robots.txt
                      Nov 26 '18 at 12:55













                    • @robots.txt try edited answer

                      – Nick
                      Nov 26 '18 at 12:59














                    0












                    0








                    0







                    Try that:



                    import asyncio
                    from pyppeteer import launch

                    url = "https://www.yellowpages.com/search?search_terms=coffee&geo_location_terms=Los%20Angeles%2C%20CA"

                    async def get_names(link):
                    wb = await launch(headless=True)
                    page = await wb.newPage()
                    await page.goto(link)

                    names = await page.querySelectorAllEval('div.v-card .business-name span',
                    '(elements => elements.map(e => e.textContent))')
                    phones = await page.querySelectorAllEval('div.v-card .phones',
                    '(elements => elements.map(e => e.textContent))')
                    result = {name: phones[idx] for (idx, name) in enumerate(names)}
                    print(result)
                    await wb.close()

                    asyncio.get_event_loop().run_until_complete(get_names(url))


                    And read documentation: querySelectorAllEval






                    share|improve this answer















                    Try that:



                    import asyncio
                    from pyppeteer import launch

                    url = "https://www.yellowpages.com/search?search_terms=coffee&geo_location_terms=Los%20Angeles%2C%20CA"

                    async def get_names(link):
                    wb = await launch(headless=True)
                    page = await wb.newPage()
                    await page.goto(link)

                    names = await page.querySelectorAllEval('div.v-card .business-name span',
                    '(elements => elements.map(e => e.textContent))')
                    phones = await page.querySelectorAllEval('div.v-card .phones',
                    '(elements => elements.map(e => e.textContent))')
                    result = {name: phones[idx] for (idx, name) in enumerate(names)}
                    print(result)
                    await wb.close()

                    asyncio.get_event_loop().run_until_complete(get_names(url))


                    And read documentation: querySelectorAllEval







                    share|improve this answer














                    share|improve this answer



                    share|improve this answer








                    edited Nov 28 '18 at 11:19









                    SIM

                    10.4k3743




                    10.4k3743










                    answered Nov 26 '18 at 12:41









                    NickNick

                    2998




                    2998













                    • I'm getting this error name = await container.querySelectorAllEval('.business-name span', AttributeError: 'ElementHandle' object has no attribute 'querySelectorAllEval' @Nick when I execute your script.

                      – robots.txt
                      Nov 26 '18 at 12:55













                    • @robots.txt try edited answer

                      – Nick
                      Nov 26 '18 at 12:59



















                    • I'm getting this error name = await container.querySelectorAllEval('.business-name span', AttributeError: 'ElementHandle' object has no attribute 'querySelectorAllEval' @Nick when I execute your script.

                      – robots.txt
                      Nov 26 '18 at 12:55













                    • @robots.txt try edited answer

                      – Nick
                      Nov 26 '18 at 12:59

















                    I'm getting this error name = await container.querySelectorAllEval('.business-name span', AttributeError: 'ElementHandle' object has no attribute 'querySelectorAllEval' @Nick when I execute your script.

                    – robots.txt
                    Nov 26 '18 at 12:55







                    I'm getting this error name = await container.querySelectorAllEval('.business-name span', AttributeError: 'ElementHandle' object has no attribute 'querySelectorAllEval' @Nick when I execute your script.

                    – robots.txt
                    Nov 26 '18 at 12:55















                    @robots.txt try edited answer

                    – Nick
                    Nov 26 '18 at 12:59





                    @robots.txt try edited answer

                    – Nick
                    Nov 26 '18 at 12:59


















                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53481018%2fideal-way-of-creating-for-loops-using-pyppeteer%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    A CLEAN and SIMPLE way to add appendices to Table of Contents and bookmarks

                    Calculate evaluation metrics using cross_val_predict sklearn

                    Insert data from modal to MySQL (multiple modal on website)