Python webscraping: BeautifulSoup не показывает весь исходный контент html - PullRequest
0 голосов
/ 13 декабря 2018

Я довольно новичок в веб-стрипинге и питоне.Я пытался создать сценарий, который получает цену последней сделки от http://finra -markets.morningstar.com / BondCenter / BondDetail.jsp? Symbol = NFLX4333665 & ticker = C647273 , но, по-моему, отсутствует некоторое содержимое, когда я запрашиваюэто с питоном. Ранее я создавал сценарии, которые успешно получали данные с других веб-сайтов, но, похоже, не могу заставить свой код работать на этом веб-сайте. Это мой код:

from bs4 import BeautifulSoup
import requests

r = requests.get("http://finra-markets.morningstar.com/BondCenter/BondDetail.jsp?symbol=NFLX4333665&ticker=C647273")
c = r.content
soup = BeautifulSoup(c, "html.parser")

all = soup.find_all("div", {"class": "gr_row_a5"})
print(soup)

когда я запускаю это, большинство важных данных отсутствует.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Будьте осторожны с iframe

Если вы заметили, div class="gr_row_a5" находится внутри iframe .Чтобы сканировать данные внутри iframe, вам нужно зайти внутрь этого iframe, а затем взять источник страницы.

from selenium import webdriver
import selenium
import httplib
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import StaleElementReferenceException
from selenium.common.exceptions import WebDriverException
from datetime import datetime as dt
from bs4 import BeautifulSoup


browser = webdriver.Chrome()
browser.delete_all_cookies()
browser.get('http://finra-markets.morningstar.com/BondCenter/BondDetail.jsp?symbol=NFLX4333665&ticker=C647273')

iframe = browser.find_element_by_id('ms-bond-detail-iframe')
browser.switch_to_frame(iframe)

c = browser.page_source
soup = BeautifulSoup(c, "html.parser")

all = soup.find_all("div", {"class": "gr_row_a5"})
print(all)

Надеюсь, что это решит вашу проблему, если не любезно, дайте мне знать.Спасибо

0 голосов
/ 13 декабря 2018

Некоторые веб-страницы заполняют данные с использованием Javascript, и то, что кажется содержимым страницы, на самом деле отсутствует в HTML, который обрабатывает Beautiful Soup.Это одна из тех страниц.

Это сбивает с толку, потому что если вы просматриваете отображаемую страницу с помощью инструментов веб-разработчика в (скажем) Safari или Chrome, вы найдете HTML-код, отображаемый в DOM.Однако, если вы посмотрите на источник страницы, вы его вообще не найдете.

Так что для этой страницы вы не можете разобрать данные с Beautiful Soup.Одним из вариантов может быть сайт, который предоставит вам данные более прямым способом.Другой может быть попытаться использовать библиотеку requests-html, которая может запускать Javascript, а затем вы можете очистить данные от визуализированного HTML.(Примечание: я никогда не пробовал requests-html сам, и нужно соблюдать осторожность при запуске Javascript таким образом, но это приемлемый способ сделать это.) Есть также проекты, где люди использовали Selenium или что-то подобное в качестве способаполучить HTML для очистки.Но requests-html выглядит самой простой вещью, которую можно попробовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...