Невозможно извлечь td, имеющий разные классы, используя BeautifulSoup в Python - PullRequest
0 голосов
/ 18 февраля 2019

Приведенный ниже html - это отдельный блок 'tr' из таблицы.Моя цель - извлечь каждое значение из блока 'tr'.

HTML:

   <tr><th colspan="7" class="tablehead">
Historical Data for NIFTY 50
</th></tr>
<tr><th colspan="7" class="tablehead">
For the period 01-01-2019 to 10-01-2019
</th></tr>
      <tr>          
           <th >Date</th>
           <th >Open</th>
           <th >High</th>
           <th >Low</th>
           <th >Close</th>
           <th>Shares Traded</th>
           <th >Turnover <br/>(<!--Rs.--> <img src="/images/rup_t1.gif" 
                alt = "Rs." border="0"> Cr)</th>
     </tr>
                  <tr>
                  <td class="date"><nobr>01-Jan-2019</nobr></td>
                  <td class="number">    10881.70</td>
                  <td class="number">    10923.60</td>
                  <td class="number">    10807.10</td>
                  <td class="number">    10910.10</td>
                  <td class="number">      159404542</td>
                   <td class="number">         8688.26</td> 
                  </tr>

Код Python:

rows=soup.find_all("tr")
for row in rows:
    cells=row.find_all('td')
    print(cells)

Выход:

[]

Желаемый выход:

[01-Jan-2019,10881.70,10923.60,10807.10,10910.10,159404542,8688.26]

Ответы [ 4 ]

0 голосов
/ 18 февраля 2019

Я не уверен, что это то, что вам нужно, но я взял ваш html и в обороте <th> вставил еще одну дату <td> (просто у нас есть два из них, чтобы посмотреть, можно ли обазахвачен), а также еще один <td> с фиктивным классом, чтобы посмотреть, можно ли его исключить.Теперь это выглядит так:

html ='''
<tr><th colspan="7" class="tablehead">
Historical Data for NIFTY 50
</th></tr>
<tr><th colspan="7" class="tablehead">
For the period 01-01-2019 to 10-01-2019
</th></tr>
      <tr>          
           <th >Date</th>
           <th >Open</th>
           <th >High</th>
           <th >Low</th>
           <th >Close</th>
           <th>Shares Traded</th>
           <th >Turnover <br/>(<!--Rs.--> <img src="/images/rup_t1.gif" 
                alt = "Rs." border="0"> Cr)</th>
     </tr>
                  <tr>
                  <td class="date"><nobr>01-Jan-2019</nobr></td>
                  <td class="number">    10881.70</td>
                  <td class="number">    10923.60</td>
                  <td class="date"><nobr>08-Jan-2017</nobr></td>
                  <td class="number">    10807.10</td>
                  <td class="number">    10910.10</td>
                  <td class="sushi">    zumba</td>
                  <td class="number">      159404542</td>
                  <td class="number">         8688.26</td> 
                  </tr>
'''

Код:

info = soup.findAll('td', {'class':['date', 'number']})

или

info = [item.text for item in soup.select(".date, .number")]

тогда:

for i in info:
   print(i.strip())

Вывод:

01-Jan-2019
10881.70
10923.60
08-Jan-2017
10807.10
10910.10
159404542
8688.26
0 голосов
/ 18 февраля 2019

Похоже, что вы можете использовать синтаксис css или для указания нескольких селекторов

soup.select("nobr, td.number")

То есть

data = [item.text for item in soup.select("nobr, td.number")]

Вывод:

enter image description here

0 голосов
/ 18 февраля 2019

Вот ответ.Определив функцию, которая проверяет, существуют ли оба класса, можно решить проблему.

def class_variants(css_class):
        list=['date','number']
        return css_class in list

rows = soup.find_all("tr")
for row in rows:
        cells=row.find_all('td', class_=class_variants)
        print(str(cells))
0 голосов
/ 18 февраля 2019
from bs4 import BeautifulSoup

test = '''<tr> <td class="date"><nobr>01-Jan-2019</nobr></td> 
<td class="number">10881.70</td> 
<td class="number">10923.60</td> 
<td class="number">10807.10</td> 
<td class="number">10910.10</td> 
<td class="number">159404542</td> 
<td class="number">8688.26</td> 
</tr>'''

soup = BeautifulSoup(test, 'html.parser')
data = soup.find_all("tr")


for d in data:
      print([d.text.strip().replace("\n", ",").rstrip()])

ВЫХОД:

['01-Jan-2019,10881.70,10923.60,10807.10,10910.10,159404542,8688.26']

РЕДАКТИРОВАТЬ:

from bs4 import BeautifulSoup

test = '''<tr> <td class="date"><nobr>01-Jan-2019</nobr></td> 
<td class="number">10881.70</td> 
<td class="number">10923.60</td> 
<td class="number">10807.10</td> 
<td class="number">10910.10</td> 
<td class="number">159404542</td> 
<td class="number">8688.26</td> 
</tr>'''

soup = BeautifulSoup(test, 'html.parser')
number = soup.find("nobr")
data = soup.find_all("td", class_ ="number")
data_list = []
for n in number:
    data_list.append(n)
    for d in data:
        data_list.append(d.text)

print(data_list)

ВЫХОД:

['01-Jan-2019', '10881.70', '10923.60', '10807.10', '10910.10', '159404542', '8688.26']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...