Python 网页抓取:BeautifulSoup 未显示所有 html 源内容

pre*_*edu 4 javascript python iframe web-scraping selenium-webdriver

我对网络抓取和Python还很陌生。我试图制作一个从http://finra-markets.morningstar.com/BondCenter/BondDetail.jsp?symbol=NFLX4333665&ticker=C647273获取最后交易价格的脚本,但当我用 python 请求时,某些内容似乎丢失了。我之前制作过从其他网站成功获取数据的脚本,但我似乎无法让我的代码在该网站上运行。
到目前为止,这是我的代码:

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)
Run Code Online (Sandbox Code Playgroud)


当我运行这个时,大多数重要数据都丢失了。

任何帮助将非常感激。

小智 6

有些网页使用Javascript填充数据,看起来是页面内容的内容实际上并不是Beautiful Soup正在处理的HTML。这是其中一页。

这很令人困惑,因为如果您使用 Safari 或 Chrome 中的 Web 开发人员工具检查显示的页面,您会发现已渲染到 DOM 中的 HTML。然而,如果你查看页面源代码,你根本找不到它。

所以对于这个页面,你无法用Beautiful Soup解析出数据。一种替代方案是建立一个以更直接的方式为您提供数据的网站。另一种可能是尝试该requests-html库,它可以运行 Javascript,然后您可以从呈现的 HTML 中抓取数据。(注意:我自己从未尝试过requests-html,以这种方式运行 Javascript 时应该小心,但这是一种可行的方法。)还有一些项目,人们使用 Selenium 或类似的东西作为获取 HTML 的方法刮。但requests-html看起来是最简单的尝试。


小智 5

使用 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)
Run Code Online (Sandbox Code Playgroud)

希望这能解决您的问题,如果没有请告诉我。谢谢