Python, как разобрать HTML из URL?

#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 к своему ответу ;).