Выбор вложенного третьего ребенка в BeautifulSoup - PullRequest
0 голосов
/ 19 января 2020

У меня есть следующая часть HTML и мне нужно извлечь значение 2.56 % с BeautifulSoup.

<div class="box boxRatio">
    <h2 class="sectHed">Dividend Yield Range, Past 5 Years</h2>
    <table class="rangeModTable">
    <tr>
        <td class="col1">Minimum</td>
        <td class="col2">

                1.82%

        </td>
        <td class="col3">Jan 26 2018</td>
    </tr>
    <tr>
        <td class="col1">Maximum</td>
        <td class="col2">

                3.77%

        </td>
        <td class="col3">Oct 08 2019</td>
    </tr>
    <tr>
        <td class="col1">Average</td>
        <td class="col2">

                2.56%

        </td>
        <td class="col3"></td>
    </tr>
    </table>
</div>

Я использую

divyield_box = soup.find(".boxRatio > .col2:nth-of-type(2)")

Я продолжаю получать AttributeError: у объекта 'NoneType' нет атрибута 'text'

Ответы [ 2 ]

1 голос
/ 19 января 2020
Селекторы

CSS используются с функциями .select() или .select_one(), а не .find()

Вы можете использовать:

value = soup.select_one(".rangeModTable tr:nth-of-type(3) .col2").get_text(strip=True)
print(value)

Печать:

2.56%

Или, если вы хотите выбрать значение из строки, содержащей текст «Среднее», вы можете использовать это:

value = soup.select_one('tr:has(td:contains("Average")) .col2').get_text(strip=True)
print(value)
0 голосов
/ 19 января 2020

Попробуйте решение SimplifiedDo c.

from simplified_scrapy.simplified_doc import SimplifiedDoc
html='''
<div class="box boxRatio">
    <h2 class="sectHed">Dividend Yield Range, Past 5 Years</h2>
    <table class="rangeModTable">
    <tr>
        <td class="col1">Minimum</td>
        <td class="col2">
                1.82%
        </td>
        <td class="col3">Jan 26 2018</td>
    </tr>
    <tr>
        <td class="col1">Maximum</td>
        <td class="col2">
                3.77%
        </td>
        <td class="col3">Oct 08 2019</td>
    </tr>
    <tr>
        <td class="col1">Average</td>
        <td class="col2">
                2.56%
        </td>
        <td class="col3"></td>
    </tr>
    </table>
</div>
'''
doc = SimplifiedDoc(html)
value = doc.select('.box boxRatio').getElementByText('Average').next.text
print (value)

Результат:

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