#python #html-parsing
#python #html-синтаксический анализ
Вопрос:
У меня есть код Python, который может анализировать данные из строковой переменной, содержащей HTML-код.
Мне нужен код, который получает HTML из URL, а затем анализирует эти данные.
рабочий код (синтаксический анализ HTML):
from bs4 import BeautifulSoup
data = '''
<html>
<head>
<meta name="generator"
content="HTML Tidy for HTML5 (experimental) for Windows https://github.com/w3c/tidy-
html5/tree/c63cc39" />
<title></title>
</head>
<body>
<div class="Eqh F6l Jea k1A zI7 iyn Hsu">
<div class="Shl zI7 iyn Hsu">
<a data-test-id="search-guide" href="" title="Search for amp;quot;living room colorsamp;quot;">
<div class="Jea Lfz XiG fZz gjz qDf zI7 iyn Hsu" style="white-space: nowrap; background-color:
rgb(162, 152, 139);">
<div class="tBJ dyH iFc MF7 erh tg7 IZT mWe">Living</div>
</div>
</a>
</div>
</div>
</body>
</html>
'''
soup = BeautifulSoup(data, 'html.parser')
a = soup.select('div.Eqh.F6l.Jea.k1A.zI7.iyn.Hsu a')[0]
print(a['title'])
Вот что я пробовал, но это не работает (получение HTML из URL и затем синтаксический анализ):
import requests
from bs4 import BeautifulSoup
vgm_url = 'https://www.pinterest.com/search/pins/?q=skin care'
html_text = requests.get(vgm_url).text
soup = BeautifulSoup(html_text, 'html.parser')
a = soup.select('div.Eqh.F6l.Jea.k1A.zI7.iyn.Hsu a')
for a in soup.select('div.Eqh.F6l.Jea.k1A.zI7.iyn.Hsu a'):
print(a['title'])
Я не получаю никаких ошибок, он ничего не печатает.
Я ценю вашу помощь.
Комментарии:
1. Вы действительно уверены, что в нем
html_text
есть нужный вам текст? То есть он содержит нужное вам содержимое вместо, скажем, страницы входа в систему?
Ответ №1:
Затем в процессе отладки используйте print(html_text)
, чтобы увидеть, что вы получаете ;).
Когда вы печатаете его, вы видите, что он отличается от источника страницы (посмотрите его в Chrome или другом веб-браузере и перейдите по URL). Вы также можете видеть, что страница загружается некоторое время, когда вы переходите к ней в браузере.
Поэтому вам нужно подождать, пока он загрузится с помощью чего-то вроде Selenium.
Чтобы продемонстрировать немного Selenium, я загрузил вашу страницу и щелкнул что-то с определенным классом, который загрузился через некоторое время:
# you will have to install (Chrome), or another browser driver
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = Chrome(r'C:Program Fileschromedriver.exe') # I have (Chrome) installed here
driver.get("https://www.pinterest.com/search/pins/?q=skin care")
feeling_lucky_btn = WebDriverWait(driver, 3).until( # waiting for loading
EC.presence_of_element_located(
(By.CLASS_NAME, 'GrowthUnauthPinImage__Image'))) # identifiing element by class name
feeling_lucky_btn.click()
Комментарии:
1. спасибо за ответ, я, но я хочу правильный результат, результат, который дает код, просто распечатайте длинные HTML-коды, это не решит мою проблему, если у вас нет подсказки о том, как его использовать.
2. Если
html_text
это то жеdata
самое, что и (ваш пример), и ваш пример работает, то то, что вы пробовали, тоже должно работать, верно?3. спасибо за ответ, я смотрел на результат печати, длинный HTML-код, там не было кода, который должен быть, теперь я в замешательстве.
4. @Brambor Возможно ли это вообще с
requests
помощью? Я думаю, ему нужно использоватьselenium
? Не так ли? Я вижу, что в его soup есть только 1 основной div. Больше ничего.5. @Dave99 Я добавил демонстрацию для Selenium к своему ответу ;).