Как извлечь имя и ссылки с данного веб — сайта-python

#python-3.x #selenium-webdriver #beautifulsoup

Вопрос:

Для указанного ниже веб-сайта я пытаюсь найти название и соответствующую ссылку с этого сайта. Но не в состоянии передать/получить данные вообще.

Использование BeautifulSoup

 from bs4 import BeautifulSoup
import requests

source = requests.get('https://mommypoppins.com/events/115/los-angeles/all/tag/all/age/all/all/deals/0/near/0/0')

soup = BeautifulSoup(source.text, 'html.parser')
mains = soup.find_all("div", {"class": "list-container-wrapper"})

name = []
lnks = []

for main in mains:
        name.append(main.find("a").text)
        lnks.append(main.find("a").get('href'))
 

Использование Selenium webdriver

 from selenium import webdriver
driver = webdriver.Chrome(executable_path=r"chromedriver_win32chromedriver.exe")
driver.get("https://mommypoppins.com/events/115/los-angeles/all/tag/all/age/all/all/deals/0/near/0/0")

lnks = []
name = []

for a in driver.find_elements_by_class_name('ng-star-inserted'):
    link = a.get_attribute('href')
    lnks.append(link)
    
    nm = driver.find_element_by_css_selector("#list-item-0 > div > h2 > a").text
    name.append(nm)
 

Я пробовал использовать оба вышеперечисленных метода.

Пример:

 name = ['Friday Night Flicks Drive-In at the Roadium', 'Open: Butterfly Pavilion and Nature Gardens']
lnks = ['https://mommypoppins.com/los-angeles-kids/event/in-person/friday-night-flicks-drive-in-at-the-roadium','https://mommypoppins.com/los-angeles-kids/event/in-person/open-butterfly-pavilion-and-nature-gardens']
 

Комментарии:

1. по имени, о котором вы говорите ? можете ли вы добавить пример ?

2. Спасибо @UtpalDutt. Добавлен.

Ответ №1:

Вот решение для webdriver:

 import time

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()

driver.get('https://mommypoppins.com/events/115/los-angeles/all/tag/all/age/all/all/deals/0/near/0/0')

time.sleep(3)

elements = driver.find_elements(By.XPATH, "//a[@angularticsaction='expanded-detail']")

attributes = [{el.text: el.get_attribute('href')} for el in elements]

print(attributes)
print(len(attributes))

driver.quit()
 

Вот решение с помощью webdriver и bs4:

 import time

from selenium import webdriver
from bs4 import BeautifulSoup

driver = webdriver.Chrome()
driver.get('https://mommypoppins.com/events/115/los-angeles/all/tag/all/age/all/all/deals/0/near/0/0')
time.sleep(3)

soup = BeautifulSoup(driver.page_source, 'html.parser')
mains = soup.find_all("a", {"angularticsaction": "expanded-detail"})

attributes = [{el.text: el.get('href')} for el in mains]

print(attributes)
print(len(attributes))

driver.quit()
 

Вот решение с запросами:

 import requests

url = "https://mommypoppins.com"
response = requests.get(f"{url}/contentasjson/custom_data/events_ng-block_1x/0/115/all/all/all/all/all").json()


attributes = [{r.get('node_title'): f"{url}{r['node'][r['nid']]['node_url']}"} for r in response['results']]

print(attributes)
print(len(attributes))
 

ваше здоровье!

Ответ №2:

Веб-сайт загружается динамически, поэтому requests не будет его поддерживать. Однако данные доступны в формате JSON путем отправки GET запроса на:

https://mommypoppins.com/contentasjson/custom_data/events_ng-block_1x/0/115/all/all/all/all/all .

Там нет необходимости BeautifulSoup или Selenium , использование просто requests будет работать, что сделает ваш код намного быстрее.

 import requests

URL = "https://mommypoppins.com/contentasjson/custom_data/events_ng-block_1x/0/115/all/all/all/all/all"
BASE_URL = "https://mommypoppins.com"
response = requests.get(URL).json()

names = []
links = []

for json_data in response["results"]:
    data = json_data["node"][json_data["nid"]]
    names.append(data["title"])
    links.append(BASE_URL   data["node_url"])