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

时间:2018-12-13 01:29:17

标签: javascript python selenium-webdriver iframe web-scraping

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


当我运行此文件时,大多数重要数据都丢失了。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

某些网页使用Javascript填充数据,而页面内容似乎实际上不在Beautiful Soup正在处理的HTML中。这是这些页面之一。

这令人困惑,因为如果您使用(例如)Safari或Chrome中的Web开发人员工具检查显示的页面,则会发现已渲染到DOM中的HTML。但是,如果您查看页面源,则根本找不到。

因此对于此页面,您无法使用Beautiful Soup解析数据。一个替代方案是以更直接的方式为您提供数据的站点。另一种可能是尝试使用requests-html库(该库可以运行Javascript),然后可以从呈现的HTML中抓取数据。 (注意:我自己从未尝试过requests-html,因此应该谨慎地以这种方式运行Javascript,但这是一种可行的方法。)还有一些项目中人们在使用Selenium或类似的东西。抓取HTML的方法。但是requests-html似乎是最简单的尝试。

答案 1 :(得分:0)

请注意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)

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