繁体   English   中英

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

[英]Python webscraping: BeautifulSoup not showing all html source content

我对webscraping和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填充数据,而页面内容似乎实际上不在Beautiful Soup正在处理的HTML中。 这是这些页面之一。

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

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

小心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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM