Попытка напечатать одну строку таблицы с помощью BeautifulSoup, но расположение линии продолжает меняться - PullRequest
2 голосов
/ 05 июля 2019

Итак, я пытаюсь распечатать строку таблицы, используя BeautifulSoup, но я не могу просто использовать идентификатор строки, потому что расположение строки может меняться в зависимости от пары разных переменных. Все строки имеют имена вроде 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 ]

1 голос
/ 06 июля 2019

Я не уверен, в чем именно проблема. Решение @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())

А если вы смените тактику и замените выделение css find() методами

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

что, я считаю, это то, что вы ищете.

0 голосов
/ 05 июля 2019

Вы можете использовать селектор CSS :has() и :contains(), чтобы выбрать строку с тд, которая содержит выделенный текст:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...