尝试使用BeautifulSoup打印表格的一行,但是行的位置不断变化

时间:2019-07-05 17:04:26

标签: python beautifulsoup

因此,我试图使用BeautifulSoup来打印表格行,但我不能仅使用该行的ID,因为该行的位置可能会根据几个不同的变量而变化。所有行的名称都类似于trRow_1。我需要做的是将包含要查找的文本的行打印出来,因为它一直在移动。

我无法弄清楚用if语句打印出所需行的措辞。

这是我尝试过的方法,显然不起作用,但是应该让您了解我想要的东西:


table = soup1.find("table", id="tblActivities")
tablerow = table.findAll("tr")
TextIwant = tablerow.find(<span>"The Text I Want"</span>)
print(TextIWant)

关于如何执行此操作的任何想法?

这是我正在使用的行元素:

<tr id="trRow_5" class="changeTrOnhover" uniqueid="" rowid="2200005" action="0" postype="0" levelclass="2200005" riskcountry="United States" issuecurrency="" riskregion="" seq="5">

                     <!-- End positionDetail greater than 0 -->  


                        <td>





                                        <span class="bold"> Cash Equivalent

                            </span>
                        </td>  <!-- Asset class desc -->


                        <td><span></span></td>      <!-- price -->
                        <td><span></span></td>       <!-- quantity -->
                        <!-- START PSI19 US77980 Populate values for Investment cost -->

                            <td class="bold"><span>
                                <span>52,896.91 USD
                            </span></span></td>

                        <!-- END PSI19 US77980 Populate values for Investment cost -->
                        <!-- base mkt -->

                        <td class="bold"><span>
                        52,896.91 USD
                        </span></td>

                        <!-- local mkt -->

                        <!-- perc of class -->

                        <td nowrap="">
                            <span class="bold">

                                    6.88

                            </span>
                        </td>    

                        <!-- perc of total mkt -->

                        <!-- income yield -->

                        <!-- moodys -->


                        <td><span></span></td>     <!-- action -->
                     <!-- positionDetail = 0 -->     
                </tr>           


soup.select_one('table#tblActivities').select('tr:has(td:contains("Cash Equivalent")) td') 

这将返回所有表行。


for td in table.select('tr:has(td:contains("Cash Equivalent")) td'):
print(td.text.strip())

这还将返回表中的所有行。

2 个答案:

答案 0 :(得分:1)

我不确定是什么问题。 @Andrej Kesely的解决方案对我有用。他的解决方案的简化版本也可以使用:

soup = bs([your html above],'html5')

for element in soup.select('tr:has(span:contains("Cash Equivalent"))'):
         print(element.text.replace('\n','').strip())

如果您改变策略并用find()方法替换css选择

tab = soup.find('table',id='tblActivities')
row = soup.find(lambda tag:tag.name=="span" and "Cash Equivalent" in tag.text)
for i in row:
    print(i.parent.parent.parent.text.strip().replace('\n',''))

那也行。在所有这些情况下,输出为:

  

现金等值

     

52,896.91美元

     

52,896.91美元

     

6.88

我相信这就是您要寻找的。

答案 1 :(得分:0)

您可以使用CSS选择器:has():contains()用td选择包含所选文本的行:

data = '''
<table id="tblActivities">
    <tr>
        <td>I Dont want this</td>
        <td>I Dont want this</td>
        <td>I Dont want this</td>
    </tr>

    <tr>
        <td>Some data</td>
        <td><span>The Text I Want</span></td>
        <td>Some data</td>
    </tr>

    <tr>
        <td>I Dont want this</td>
        <td>I Dont want this</td>
        <td>I Dont want this</td>
    </tr>
</table>

'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(data, 'lxml')

table = soup.select_one('table#tblActivities')

for td in table.select('tr:has(td:contains("The Text I Want")) td'):
    print(td.text)

打印:

Some data
The Text I Want
Some data

进一步阅读:

CSS Selector reference