Очистка динамически сгенерированной HTML-таблицы без идентификатора и класса с помощью BeautifulSoup

#python-3.x #selenium #web-scraping #beautifulsoup

#python-3.x #selenium #очистка веб-страниц #beautifulsoup

Вопрос:

Я сгенерировал таблицу с использованием Python Selenium, и исходный код сгенерированной таблицы выглядит следующим образом (код имеет

         <TABLE cellSpacing=0 cellPadding=0 width=806 border=0>
    <TBODY>
    <TR>          <TD width="603" height="25" colspan="4" align="center" bgcolor="#00596B">            
        <b><font color="#FFFFFF">Day End Summary from Jan 03, 2019 to Jan 01, 2019</font></b>             </TD>       </TR>

    <tr>
      <TD vAlign=top align=middle width="603" style="min-height:980px;">
        <table border="0" cellpadding="" width="603" bgcolor="#808000" cellspacing="1">
          <tr bgcolor="#D6D6D6" height="25">
            <td align="center"><font color="#000" size="2">#</font></td>
          <td align="center"><font color="#000" size="2">DATE</font></td>
          <td align="center"><font color="#000" size="2">TRADING CODE</font></td>
            <td align="center"><font color="#000" size="2">LTP*</font></td>
          <td align="center"><font color="#000" size="2">HIGH</font></td>
          <td align="center"><font color="#000" size="2">LOW</font></td>
          <td align="center"><font color="#000" size="2">OPENP*</font></td>
          <td align="center"><font color="#000" size="2">CLOSEP*</font></td>
          <td align="center"><font color="#000" size="2">YCP</font></td>
          <td align="center"><font color="#000" size="2">TRADE</font></td>
          <td align="center"><font color="#000" size="2">VALUE (mn)</font></td>
          <td align="center"><font color="#000" size="2">VOLUME</font></td>                
          </tr>

          <tr bgcolor="#FFFFFF" height="20">
            <td align="center"> <font face="Arial" style="size:11px;">1</font></td>
          <td align="center"> <font face="Arial" style="size:11px;">2019-01-03</font></td>
          <td align="left"><a href = "displayCompany.php?name=ACI" class='ab1'><font face="Arial" style="size:11px;">ACI</font></a></td>
          <td align="right"><font face="Arial" style="size:11px;">328.5</font></td>
          <td align="right"><font face="Arial" style="size:11px;">329.9</font></td>
          <td align="right"><font face="Arial" style="size:11px;">323</font></td>
          <td align="right"><font face="Arial" style="size:11px;">325.7</font></td>
          <td align="right"><font face="Arial" style="size:11px;">328.4</font></td>
          <td align="right"><font face="Arial" style="size:11px;">325.7</font></td>
          <td align="right"><font face="Arial" style="size:11px;">256</font></td>
          <td align="right"><font face="Arial" style="size:11px;">5.285</font></td>
          <td align="right"><font face="Arial" style="size:11px;">16,158</font></td>
          </tr>

          <tr bgcolor="#EFEFEF" height="20">
            <td align="center"> <font face="Arial" style="size:11px;">2</font></td>
          <td align="center"> <font face="Arial" style="size:11px;">2019-01-02</font></td>
          <td align="left"><a href = "displayCompany.php?name=ACI" class='ab1'><font face="Arial" style="size:11px;">ACI</font></a></td>
          <td align="right"><font face="Arial" style="size:11px;">325.5</font></td>
          <td align="right"><font face="Arial" style="size:11px;">328.8</font></td>
          <td align="right"><font face="Arial" style="size:11px;">324.3</font></td>
          <td align="right"><font face="Arial" style="size:11px;">326</font></td>
          <td align="right"><font face="Arial" style="size:11px;">325.7</font></td>
          <td align="right"><font face="Arial" style="size:11px;">327.6</font></td>
          <td align="right"><font face="Arial" style="size:11px;">289</font></td>
          <td align="right"><font face="Arial" style="size:11px;">7.443</font></td>
          <td align="right"><font face="Arial" style="size:11px;">22,851</font></td>
          </tr>

          <tr bgcolor="#FFFFFF" height="20">
            <td align="center"> <font face="Arial" style="size:11px;">3</font></td>
          <td align="center"> <font face="Arial" style="size:11px;">2019-01-01</font></td>
          <td align="left"><a href = "displayCompany.php?name=ACI" class='ab1'><font face="Arial" style="size:11px;">ACI</font></a></td>
          <td align="right"><font face="Arial" style="size:11px;">329.1</font></td>
          <td align="right"><font face="Arial" style="size:11px;">329.9</font></td>
          <td align="right"><font face="Arial" style="size:11px;">325.6</font></td>
          <td align="right"><font face="Arial" style="size:11px;">329.9</font></td>
          <td align="right"><font face="Arial" style="size:11px;">327.6</font></td>
          <td align="right"><font face="Arial" style="size:11px;">326.2</font></td>
          <td align="right"><font face="Arial" style="size:11px;">153</font></td>
          <td align="right"><font face="Arial" style="size:11px;">3.234</font></td>
          <td align="right"><font face="Arial" style="size:11px;">9,890</font></td>
          </tr>

        </table>
  

Ссылка на страницу находится здесь Dhaka Stock Exchange Historical Price.
Теперь, как я могу извлечь полную таблицу отсюда? Похоже, что таблица не имеет никакого идентификатора и класса. Я совершенно новичок в HTML и веб-очистке, и мне нужно сделать это для проекта, у которого очень плотный график. Буду признателен за любую помощь.

Обновление: я мог бы извлечь требуемую таблицу с помощью следующего кода- def extractdse(fdate, tday, instrument):

 # load the driver
driver = webdriver.Chrome()

# load DSE data archive site
driver.get('https://www.dsebd.org/day_end_archive.php')

# deal with the pop up warning
try: 
    alert = driver.switch_to.alert
    alert.accept()
except NoAlertPresentException:
    print ("No alert here")

# from date
fdate=datetime.datetime.strptime(fdate, '%Y-%m-%d')
yr=str(fdate.year)
mn='0' str(fdate.month)
dy='0' str(fdate.day)

# to date
tday=datetime.datetime.strptime(tday, '%Y-%m-%d')
bdd='0' str(tday.day)
bdm='0' str(tday.month)
bdy=str(tday.year)

# beginning day
x=Select(driver.find_element_by_name("DayEndSumDate1_day"))
x.select_by_value(dy)

# beginning month
y=Select(driver.find_element_by_name("DayEndSumDate1_month"))
y.select_by_value(mn)

# beginning year
z=Select(driver.find_element_by_name("DayEndSumDate1_year"))
z.select_by_value(yr)

# end day
xp=Select(driver.find_element_by_name("DayEndSumDate2_day"))
xp.select_by_value(bdd)

# end month
yp=Select(driver.find_element_by_name("DayEndSumDate2_month"))
yp.select_by_value(bdm)

# end year
zp=Select(driver.find_element_by_name("DayEndSumDate2_year"))
zp.select_by_value(bdy)

# instrument
inst=Select(driver.find_element_by_name("Symbol"))
inst.select_by_visible_text(instrument)

# generate the table
driver.find_element_by_name("ViewDayEndArchive").click()

# extract the table
soup = BeautifulSoup(driver.page_source, 'html.parser')
tables = soup.find_all('table')
tt=tables[374]
#ti=pd.read_html(tt)
#tm=display_html(tt, raw=True)
#tx=pd.read_html(tt)
return(tt)
  

И теперь можем извлечь HTML-код для требуемой таблицы с-

 extractdse('2019-01-01', '2019-01-03', 'ACI')
  

Теперь, есть ли какой-либо способ преобразовать HTML-код в фрейм данных Pandas?

Комментарии:

1. Можете ли вы поделиться тем, что вы пробовали?

Ответ №1:

Вероятно, для этого следует использовать pandas. Что-то вроде:

 my_table = """
  [the code from your question]
 """

import pandas as pd

pad_table = pd.read_html(my_table)
pad_table
  

Это должно помочь вам пройти большую часть пути.