Возьмите второй элемент NavigatableList - PullRequest
0 голосов
/ 08 января 2019

Это HTML:

<table>
<tr><td>1 EUR</td><td>4,2989</td></tr>
<tr><td>1 USD</td><td>3,7575</td></tr>
<tr><td>1 CHF</td><td>3,8245</td></tr>
<tr><td>1 GBP</td><td>4,7907</td></tr>
<tr><td>100 JPY</td><td>3,4727</td></tr>
</table>

и я хочу напечатать такие числа, как 4,2989, 3,7575 и т. Д.

Я перепробовал много методов, но ничего не работает. Например:

for c in soup.children:
    print(c.contents[1])

ошибка

for c in soup.children:
    print(c.find("td")[1])

ошибка

for c in soup.children:
    for cc in c.children:
        print(cc)

ошибка

for c in soup.children:
    print(c.next_sibling)

ошибка

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Прежде всего, я думаю, что вы получаете сообщение об ошибке, потому что .children будет также содержать разделители строк, такие как '\ n', которые будут обрабатываться как bs4.element.NavigableString. Если вы будете рассматривать это как тег, вы будете наиболее вероятно получить AttributeError:

import bs4
from bs4 import BeautifulSoup
html="""
<table>
<tr><td>1 EUR</td><td>4,2989</td></tr>
<tr><td>1 USD</td><td>3,7575</td></tr>
<tr><td>1 CHF</td><td>3,8245</td></tr>
<tr><td>1 GBP</td><td>4,7907</td></tr>
<tr><td>100 JPY</td><td>3,4727</td></tr>
</table>
"""
soup=BeautifulSoup(html,'html.parser')
table=soup.find('table')
for child in table.children:
    print(repr(child))

выход

'\n'
<tr><td>1 EUR</td><td>4,2989</td></tr>
'\n'
<tr><td>1 USD</td><td>3,7575</td></tr>
'\n'
<tr><td>1 CHF</td><td>3,8245</td></tr>
'\n'
<tr><td>1 GBP</td><td>4,7907</td></tr>
'\n'
<tr><td>100 JPY</td><td>3,4727</td></tr>
'\n'

Одним из решений было бы получение только тех процессов, которые не являются NavigableString.

import bs4
from bs4 import BeautifulSoup
html="""
<table>
<tr><td>1 EUR</td><td>4,2989</td></tr>
<tr><td>1 USD</td><td>3,7575</td></tr>
<tr><td>1 CHF</td><td>3,8245</td></tr>
<tr><td>1 GBP</td><td>4,7907</td></tr>
<tr><td>100 JPY</td><td>3,4727</td></tr>
</table>
"""
soup=BeautifulSoup(html,'html.parser')
table=soup.find('table')
for child in table.children:
    if type(child) is not bs4.element.NavigableString:
        print(child.findAll('td')[1].text)

Выход:

4,2989
3,7575
3,8245
4,7907
3,4727
0 голосов
/ 08 января 2019
from bs4 import BeautifulSoup

soup = BeautifulSoup("""<table>
<tr><td>1 EUR</td><td>4,2989</td></tr>
<tr><td>1 USD</td><td>3,7575</td></tr>
<tr><td>1 CHF</td><td>3,8245</td></tr>
<tr><td>1 GBP</td><td>4,7907</td></tr>
<tr><td>100 JPY</td><td>3,4727</td></tr>
</table>""")

soup.children возвращает только один тег, основной, поэтому он не будет работать.

Способ сделать это - использовать метод find_all следующим образом:

for x in soup.find_all('tr'): # Iterate over tr tags
    print(x.find_all('td')[1].text) # find the second td tag and get its text

# Ouptput: 4,2989 3,7575 3,8245 4,7907 3,4727

Имейте в виду, что эти числа являются строковыми, вам нужно будет преобразовать их, прежде чем использовать их как float

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