Идеальный способ создания циклов с помощью pyppeteer
Я написал сценарий в python
в комбинации с pyppeteer
вычеркнуть названия и номера телефонов различных кофеен с веб-страницы. Хотя способ, который я попробовал ниже, служит цели, сценарий выглядит очень грязно. Каков идеальный способ создания циклов с использованием pyppeteer
библиотека?
Я написал до сих пор:
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))
1 ответ
Я бы сделал так:
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))
Попробуй это:
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))
И прочитайте документацию: querySelectorAllEval