无法在Python中使用BeautifulSoup提取具有不同类的td

2024-04-20 14:07:42 发布

您现在位置:Python中文网/ 问答频道 /正文

下面提到的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]

Tags: numberforallfindtrjanclassrows
3条回答

看起来可以使用css或语法指定多个选择器

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

就是这样

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

输出:

enter image description here

这是答案。 如果定义一个函数来检查两个类是否都存在,就可以解决这个问题。你知道吗

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

我不确定这是不是你想要的,但是我用了你的html,在营业额中插入了另一个日期<th>(我们有两个,看看是否两者都能被捕获),还有另一个<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

相关问题 更多 >