BeautifulSoup (bs4) не получает элементы ни с помощью find_all, ни select, ни select_one

Пример URL для сканирования: www.yelp.com/biz/dallas-marketing-rockstar-dallas?adjust_creative=3cZu3ieq3omptvF-Yfj2ow&utm_campaign=yelp_api_v3&utm_medium=api_v3_business_search&utm_source=3cZu3ieq3omptvF-Yfj2ow'

Мой код:

def get_websites():

    for yso in Company.objects.filter(crawled=False, source='YAG'):
        r = requests.get(yso.url)
        
        soup = BeautifulSoup(r.content, 'lxml')
        if soup.select_one(".g-recaptcha") != None:
            sys.exit("Captcha")
        soup_select = soup.select_one("a[href*='biz_redir']")
        try:
            yso.website = soup_select.text
            print('website for %s added' % (yso.website))
        except Exception as e:
            print(e)
            print('no website for %s added' % yso.name)

        if not yso.crawled:
            yso.crawled = True
            yso.save()

Использование lxml и html.parser с селектором CSS soup.select_one("a[href*='biz_redir']") возвращает None, а также soup.select("a[href*='biz_redir']") — пустой список, а soup.find_all("a[href*='biz_redir']") — пустой список.

lxml version 4.5.0

beautifulsoup version 4.9.3

Редактировать: Замена "a[href*='biz_redir']" на просто a приводит к тому же результату. Есть нечто более фундаментально неправильное, чем синтаксис, если синтаксис вообще неправильный.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Данные загружаются динамически, поэтому requests не поддерживает это. Однако на сайте ссылка загружается в формате JSON, вы можете извлечь ее с помощью модуля json.

import re
import json
import requests
from bs4 import BeautifulSoup

URL = "https://www.yelp.com/biz/dallas-marketing-rockstar-dallas?adjust_creative=3cZu3ieq3omptvF-Yfj2ow&utm_campaign=yelp_api_v3&utm_medium=api_v3_business_search&utm_source=3cZu3ieq3omptvF-Yfj2ow%27"

soup = BeautifulSoup(requests.get(URL).content, "html.parser")

script = soup.select_one(
    "#wrap > div.main-content-wrap.main-content-wrap--full > yelp-react-root > script"
).string

json_data = json.loads(re.search(r"({.*})", script).group(1))

print(
    "https://yelp.com"
    + json_data["bizDetailsPageProps"]["bizContactInfoProps"]["businessWebsite"]["href"]
)

Альтернативой может быть использование Selenium для очистки страницы, которая поддерживает динамический контент.

Установите его с помощью: pip install selenium.

Загрузите правильный ChromeDriver из здесь.

from time import sleep
from selenium import webdriver
from bs4 import BeautifulSoup


URL = "https://www.yelp.com/biz/dallas-marketing-rockstar-dallas?adjust_creative=3cZu3ieq3omptvF-Yfj2ow&utm_campaign=yelp_api_v3&utm_medium=api_v3_business_search&utm_source=3cZu3ieq3omptvF-Yfj2ow%27"
driver = webdriver.Chrome(r"c:\path\to\chromedriver.exe")
driver.get(URL)
# Wait for the page to fully render
sleep(5)

soup = BeautifulSoup(driver.page_source, "html.parser")
print("https://yelp.com" + soup.select_one("a[href*='biz_redir']")["href"])

driver.quit()

Выход:

https://yelp.com/biz_redir?url=https%3A%2F%2Fwww.rockstar.marketing&website_link_type=website&src_bizid=CodEpKvY8ZM7IbCEWxpQ0g&cachebuster=1607826143&s=d214a1df7e2d21ba53939356ac6679631a458ec0360f6cb2c4699ee800d84520

Другие вопросы по теме