采取NavigatableList的第二个元素

时间:2019-01-08 08:57:53

标签: python 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>

我想打印4,29893,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 :(得分:2)

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

请记住,这些数字是字符串,您需要先将其转换为浮点数

答案 1 :(得分:2)

首先,我认为您为什么会收到错误消息是因为.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