Предложение в комментариях использовать selenium WebDriver, вероятно, является самым простым решением для вашей проблемы.Похоже, вы пытаетесь очистить сайт, который динамически генерирует контент, с помощью шаблонов Django или чего-то подобного.
Таким образом, вам нужно эмулировать браузер, чтобы фактически загрузить весь контент на странице, поскольку в настоящее время вы получаете только статический HTML.Вы можете установить selenium с помощью менеджера пакетов, затем вам нужно установить драйвер для браузера, который вы хотите олицетворять:
pip install selenium
pip install chromedriver
Примечание: не все веб-драйверы могут быть установлены с вашим менеджером пакетов (я нея думаю, что вам, возможно, придется загрузить его из обычного Интернета.
Теперь вы можете использовать что-то вроде этой функции, которую я написал, чтобы очистить нужную страницу:
# purpose: a function which takes a url and extracts the contents as a string
# depends on selenium webdriver to turn js-scripts into html as well as time and os libraries
# signature: pull_html_page(url:string, write:optional boolean) -> string
def pull_html_page(url, write = False):
driver = webdriver.Chrome()
driver.get(url)
time.sleep(1)
content = driver.page_source.encode('utf-8')
driver.quit()
if write == True:
# the "my dick computer won't let me be root" workaround
if os.geteuid() == 0:
print("We're root!")
else:
print("We're not root.")
CURRENT_SCRIPT = os.path.realpath(__file__)
os.system('echo ' + PASSWORD_FOR_SUDO + '|sudo -S python '+ CURRENT_SCRIPT)
clean = BeautifulSoup(content, "html.parser").prettify()
f = open("out.html", "w+")
f.write(clean)
f.close()
return content
Еслиэто решение недостаточно эффективно для вас, или вам нужны только динамически генерируемые данные и ничего из статического html.Вы часто можете использовать свой инструмент проверки (я предпочитаю тот, что на Chrome), чтобы увидеть сетевой трафик.Иногда вы можете увидеть URL-адрес, возвращающий ответ JSON, это сэкономит вам время загрузки страницы, и вы сможете очистить данные непосредственно из URL-адреса ответа.
удачи!