尝试使用BeautifulSoup打印表的单行,但行位置不断更改

2024-06-03 14:21:12 发布

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

因此,我尝试使用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())

这也会返回表中的所有行。你知道吗


Tags: idfortablecashfindselecttrclass
2条回答

我不确定到底是什么问题。@安德烈·凯斯利的解决方案对我很有效。他的解决方案的简化版本也适用:

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

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

Cash Equivalent

52,896.91 USD

52,896.91 USD

6.88

我相信这正是你要找的。你知道吗

您可以使用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

相关问题 更多 >