bs4 красивый суп почему-то не находит div'ов с div'ами - PullRequest
0 голосов
/ 10 марта 2020

HTML:

<div id="divTradeHaltResults"> 
<div class="genTable"
   <table>
    <tbody>
    <tr> 
	 <td> 03/10/2020  </td> 
	 <td> 15:11:45     </td>

Код:

url = r'https://www.nasdaqtrader.com/trader.aspx?id=TradeHalts'
r=requests.get(url)
soup = BeautifulSoup(r.content, "html.parser")
table = soup.find('div',{'id':'divTradeHaltResults'})
divclass=table.find('div',{'class':"genTable"})

divt=divclass.find('table')

результат:

divclass={None Type}None

Я попытался парсером 'l xml' безрезультатно.
Я могу получить его с помощью Selenium, но он использует слишком много ресурсов.
Из проверки всех других проблем, связанных с несколькими div'ами
, кажется, есть и врожденная проблема с bs4.
Кто-нибудь решил эту проблему? ? Я попробовал несколько идей от других
людей.

1 Ответ

1 голос
/ 10 марта 2020

Причина, по которой вы получаете None, это потому, что страница загружается динамически через JavaScript, который отображается после загрузки самой страницы.

Поэтому я смог отследить происхождение table, откуда JS отправляет запрос XHR для его получения. это можно отследить через ваш браузер Developer-Tools в Network-Tab.

В противном случае вы можете использовать selenium для этого. Я включил оба решения для вас.

import requests
import pandas as pd


json = {
    "id": 2,
    "method": "BL_TradeHalt.GetTradeHalts",
    "params": "[]",
    "version": "1.1"
}

headers = {
    'Referer': 'https://www.nasdaqtrader.com/trader.aspx?id=TradeHalts'
}

r = requests.post(
    "https://www.nasdaqtrader.com/RPCHandler.axd", json=json, headers=headers).json()

df = pd.read_html(r["result"])[0]

df.to_csv("table1.csv", index=False)

Вывод: просмотр в режиме онлайн

from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from bs4 import BeautifulSoup
import pandas as pd


options = Options()
options.add_argument('--headless')
driver = webdriver.Firefox(options=options)

driver.get(
    "https://www.nasdaqtrader.com/trader.aspx?id=TradeHalts")

df = pd.read_html(driver.page_source)[2]

# print(df)
df.to_csv("table.csv", index=False)
driver.quit()

Вывод: просмотр в режиме онлайн

...