Python, BeautifulSoup - также не может получить текст определенного элемента без его братьев и сестер - PullRequest
0 голосов
/ 27 мая 2019

Я здесь немного новичок, поэтому, пожалуйста, прости мое невежество. Я пытаюсь получить строку кода, которая будет возвращена только для определенных элементов тега. Проблема в том, что мои подходы дают эти соответствующие результаты ...:

for items in soup.find('td', text='Trading Symbol').parent.find_all('td'):
ticker = [items.text.strip()]
print(ticker)

['Trading Symbol']
['AAPL']
['']

и

    for items in soup.find('td', text='Trading Symbol').parent.find_all('td'):
    for td in items.find('td', {'class':['text']}):
        ticker = [td.text.strip()]
        print(ticker)

....error message....for td in items.find('td', {'class':['text']}):
    TypeError: 'NoneType' object is not iterable

Я понимаю, почему первый код делает то, что делает - я не указал точно, что я ищу (тикер AAPL), но я не знаю, почему добавление еще одной строки кода с указанием класса не делает ' сузить список. Глядя на суп (который я привел ниже), я понял, что дополнительная строка кода уберет «Торговый символ» и оставит «AAPL» и «[]», но ничего не даст. Любая помощь здесь?

Вот суп. Существуют сотни тегов класса re, поэтому фильтрация с использованием может оказаться полезной, но это не конец.

##      <tr class="re">
##      <td class="pl " style="border-bottom: 0px;" valign="top"><a class="a" href="javascript:void(0);" onclick="top.Show.showAR( this, 'defref_dei_TradingSymbol', window );">Trading Symbol</a></td>
##      <td class="text">AAPL<span></span>
##      </td>

Ответы [ 3 ]

0 голосов
/ 28 мая 2019

Это добилось цели.Спасибо всем!

for item in soup.find('td', text='Trading Symbol').parent.find_all('td', {'class':['text']}):
    ticker = [item.text.strip()]
    print(ticker)
0 голосов
/ 28 мая 2019

С bs4 4.7.1 вы можете использовать: содержит вместе с общим комбинатором братьев и сестер, чтобы получить эти tds

import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://www.sec.gov/Archives/edgar/data/320193/0000320193-18-000070.txt')
soup = bs(r.content, 'lxml')
siblings = [item.text.strip() for item in soup.select('td:contains("Trading Symbol") ~ td')]
print(siblings)
0 голосов
/ 27 мая 2019

Вы уже на уровне тд. Если вы хотите, чтобы фрагмент кода работал, попробуйте

for td in items.parent.find('td', {'class':['text']}):
...