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

问题描述 投票:0回答:2

我对网络抓取和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)


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

任何帮助将不胜感激。

javascript python selenium-webdriver iframe web-scraping
2个回答
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)

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

© www.soinside.com 2019 - 2024. All rights reserved.