我正试图从betfair(https://www.betfair.com.au/exchange/plus/australian-rules)刮起AFL赔率。 我对网络爬虫还很陌生,但是已经设法摆脱了其他博彩公司的麻烦,但是我在必发方面遇到了麻烦。我需要的数据在“ ui-view”标签内,当我使用Beautiful soup获取HTML时,该标签似乎没有打开。
我在加载页面以获取赔率时尝试使用硒未成功。
from selenium import webdriver
from bs4 import BeautifulSoup
import pprint as pp
BETFAIR_URL = "https://www.betfair.com.au/exchange/plus/australian-rules"
#functions
def parse(url):
# open url
driver = webdriver.Chrome(
'C:/Users/Maroz/Downloads/chromedriver_win32 (1)/chromedriver.exe')
# opens page
driver.get(url)
# parses as html
soup = BeautifulSoup(driver.page_source, 'html.parser')
# closes same
driver.quit()
return soup
betfair_soup = parse(BETFAIR_URL)
pp.pprint(betfair_soup)
#edit to show that it finds nothing in the span i need which is within the ui-#tags
price = betfair_soup.find_all("span", {"class": "bet-button-price"})
pp.pprint(price)
#output is []
我希望betfair_soup在此标签ui-view中包含信息 但是,当打印到终端时,它保持关闭状态。 不允许我发布图片,因为这是我的第一篇文章,但是您可能可以在这里看到我尝试访问的标签的屏幕截图。 https://imgur.com/gallery/jI3MQYY
根据要求,这里是进入终端的html:
<!--[if IE]>
<script type="text/javascript">window['isIE'] = true;</script>
<![endif]-->
<!-- Set ie10 class: http://www.impressivewebs.com/ie10-css-hacks/ -->
<!--[if !IE]><!-->
<script>
(function () {
var isIE10 = Function('/*@cc_on return document.documentMode===10@*/')();
if (isIE10) {
document.documentElement.className += ' ie10';
}
})();
</script>
<!--<![endif]-->
<bf-meta-tags></bf-meta-tags>
<bf-tooltip-guide><div class="tooltip-guide-container" ng-controller="TooltipGuideController as controller"><!-- --></div></bf-tooltip-guide>
<!-- --><ui-view></ui-view> #INFO IS IN HERE
<script src="//ie2eds.cdnppb.net/resources/eds/bundle/vendor-assets-min_4146.js"></script>
<script src="//ie2eds.cdnppb.net/resources/eds/bundle/bf-eds-static-client.min_4146_.js"></script>
<script type="text/javascript">
我在赔率所在的位置添加了一条注释,当我查看页面源代码时,标签也已关闭,因此,除了检查赔率框上的元素之外,没有其他方法可以向我展示我看到的内容我在上面发布的照片链接^
edit:在尝试建议等待ui-view加载后,这是整个响应,但是我仍然无法访问span标记中的信息。 https://pastebin.com/v6JzYa6V
最终编辑:问题已解决!谢谢大家的建议,特别感谢S Ahmed为我解决问题的坚持!
答案 0 :(得分:0)
看起来加载<ui-view>
标记的内容需要花费时间,并且它是由javascript加载的。在获取页面源之前,尝试等待内部元素出现。
尝试一下:
def parse(url):
driver.get(url)
try:
WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.ID,"main-wrapper")))
except:
pp.pprint("Exception")
finally:
soup = BeautifulSoup(driver.page_source, 'html.parser')
return soup
driver.quit()
您必须导入以下库
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
编辑:
尝试等待span.bet-button-price
代替#main-wrap
出现
WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.CSS_SELECTOR,"span.bet-button-price")))