加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – BeautifulSoup – 从表中抓取文本不起作用

发布时间:2020-12-16 22:52:41 所属栏目:Python 来源:网络整理
导读:我想从网站http://www.x-rates.com/table/?from=USDamount=1(它是货币兑换网站)废弃数据. 我想从表中得到“欧元”字样,但我得到空列表.这是我的代码: from bs4 import BeautifulSoupimport requestsres = requests.get('http://www.x-rates.com/table/?from

我想从网站http://www.x-rates.com/table/?from=USD&amount=1(它是货币兑换网站)废弃数据.

我想从表中得到“欧元”字样,但我得到空列表.这是我的代码:

from bs4 import BeautifulSoup

import requests

res = requests.get('http://www.x-rates.com/table/?from=USD&amount=1')
soup = bs4.BeautifulSoup(res.text,'html.parser')
hehe = soup.select('table.ratesTable:nth-child(4) > tbody:nth-child(2) > tr:nth-child(1) > td:nth-child(1)')
print hehe

我也试过这个:

hehe = soup.select('table.ratesTable + table.ratesTable + table.ratesTable + table.ratesTable  table.ratesTable + tbody + tbody + tbody + tr + tr + td + td')

但仍然没有.我应该改变什么?

最佳答案
如果你想使用select你可以使用bs4支持的使用nth-of-type来拉出第一个欧元出现的表格中的第一个td:

soup = BeautifulSoup(res.text,'html.parser')

hee = soup.select(".ratesTable td:nth-of-type(1)")
print(hee)

输出:

[

如果你想更具体,你可以使用table.class ..:

print(soup.select("table.ratesTable td:nth-of-type(1)"))

并获得第二个欧元:

# 16th row,first td 
print(soup.select(".tablesorter.ratesTable tr:nth-of-type(16) td:nth-of-type(1)"))

输出:

[

或者使用find:

soup = BeautifulSoup(res.text,'html.parser')
table = soup.find("table",{"class":"ratesTable"})
print(table.td.text)
print(table)

输出:

Euro

如果您使用了soup.select(“table.ratesTable:nth-??child(4)”),您将看到它没有返回任何内容,因此您的css是错误的.

获取所有数据:

# two tables 
tables = soup.select(".ratesTable")
table_data = {}
cols = [th.text for th in tables[0].find_all("th")]
for table in tables:
    for tr in table.find_all("tr"):
        data = [td.text for td in tr.find_all("td")]
        if data:
            table_data[data[0]] = dict(zip(cols,data))


from pprint import pprint as pp

pp(table_data)

输出:

{u'Argentine Peso': {u'1.00 USD': u'15.358344',u'US Dollar': u'Argentine Peso',u'inv. 1.00 USD': u'0.065111'},u'Australian Dollar': {u'1.00 USD': u'1.388393',u'US Dollar': u'Australian Dollar',u'inv. 1.00 USD': u'0.720257'},u'Bahraini Dinar': {u'1.00 USD': u'0.376989',u'US Dollar': u'Bahraini Dinar',u'inv. 1.00 USD': u'2.652595'},u'Botswana Pula': {u'1.00 USD': u'11.219075',u'US Dollar': u'Botswana Pula',u'inv. 1.00 USD': u'0.089134'},u'Brazilian Real': {u'1.00 USD': u'3.927908',u'US Dollar': u'Brazilian Real',u'inv. 1.00 USD': u'0.254588'},u'British Pound': {u'1.00 USD': u'0.716854',u'US Dollar': u'British Pound',u'inv. 1.00 USD': u'1.394983'},u'Bruneian Dollar': {u'1.00 USD': u'1.403737',u'US Dollar': u'Bruneian Dollar',u'inv. 1.00 USD': u'0.712384'},u'Bulgarian Lev': {u'1.00 USD': u'1.771194',u'US Dollar': u'Bulgarian Lev',u'inv. 1.00 USD': u'0.564591'},u'Canadian Dollar': {u'1.00 USD': u'1.362152',u'US Dollar': u'Canadian Dollar',u'inv. 1.00 USD': u'0.734132'},u'Chilean Peso': {u'1.00 USD': u'689.453282',u'US Dollar': u'Chilean Peso',u'inv. 1.00 USD': u'0.001450'},u'Chinese Yuan Renminbi': {u'1.00 USD': u'6.532590',u'US Dollar': u'Chinese Yuan Renminbi',u'inv. 1.00 USD': u'0.153079'},u'Colombian Peso': {u'1.00 USD': u'3321.597022',u'US Dollar': u'Colombian Peso',u'inv. 1.00 USD': u'0.000301'},u'Croatian Kuna': {u'1.00 USD': u'6.926768',u'US Dollar': u'Croatian Kuna',u'inv. 1.00 USD': u'0.144367'},u'Czech Koruna': {u'1.00 USD': u'24.605774',u'US Dollar': u'Czech Koruna',u'inv. 1.00 USD': u'0.040641'},u'Danish Krone': {u'1.00 USD': u'6.783374',u'US Dollar': u'Danish Krone',u'inv. 1.00 USD': u'0.147419'},u'Emirati Dirham': {u'1.00 USD': u'3.672956',u'US Dollar': u'Emirati Dirham',u'inv. 1.00 USD': u'0.272260'},u'Euro': {u'1.00 USD': u'0.909064',u'US Dollar': u'Euro',u'inv. 1.00 USD': u'1.100033'},u'Hong Kong Dollar': {u'1.00 USD': u'7.770873',u'US Dollar': u'Hong Kong Dollar',u'inv. 1.00 USD': u'0.128686'},u'Hungarian Forint': {u'1.00 USD': u'282.628733',u'US Dollar': u'Hungarian Forint',u'inv. 1.00 USD': u'0.003538'},u'Icelandic Krona': {u'1.00 USD': u'129.157149',u'US Dollar': u'Icelandic Krona',u'inv. 1.00 USD': u'0.007743'},u'Indian Rupee': {u'1.00 USD': u'68.885961',u'US Dollar': u'Indian Rupee',u'inv. 1.00 USD': u'0.014517'},u'Indonesian Rupiah': {u'1.00 USD': u'13420.180741',u'US Dollar': u'Indonesian Rupiah',u'inv. 1.00 USD': u'0.000075'},u'Iranian Rial': {u'1.00 USD': u'30193.236727',u'US Dollar': u'Iranian Rial',u'inv. 1.00 USD': u'0.000033'},u'Israeli Shekel': {u'1.00 USD': u'3.907342',u'US Dollar': u'Israeli Shekel',u'inv. 1.00 USD': u'0.255928'},u'Japanese Yen': {u'1.00 USD': u'112.854369',u'US Dollar': u'Japanese Yen',u'inv. 1.00 USD': u'0.008861'},u'Kazakhstani Tenge': {u'1.00 USD': u'349.948907',u'US Dollar': u'Kazakhstani Tenge',u'inv. 1.00 USD': u'0.002858'},u'Kuwaiti Dinar': {u'1.00 USD': u'0.300490',u'US Dollar': u'Kuwaiti Dinar',u'inv. 1.00 USD': u'3.327899'},u'Latvian Lat': {u'1.00 USD': u'0.638890',u'US Dollar': u'Latvian Lat',u'inv. 1.00 USD': u'1.565215'},u'Libyan Dinar': {u'1.00 USD': u'1.389216',u'US Dollar': u'Libyan Dinar',u'inv. 1.00 USD': u'0.719831'},u'Lithuanian Litas': {u'1.00 USD': u'3.138815',u'US Dollar': u'Lithuanian Litas',u'inv. 1.00 USD': u'0.318592'},u'Malaysian Ringgit': {u'1.00 USD': u'4.215841',u'US Dollar': u'Malaysian Ringgit',u'inv. 1.00 USD': u'0.237201'},u'Mauritian Rupee': {u'1.00 USD': u'35.959724',u'US Dollar': u'Mauritian Rupee',u'inv. 1.00 USD': u'0.027809'},u'Mexican Peso': {u'1.00 USD': u'18.099833',u'US Dollar': u'Mexican Peso',u'inv. 1.00 USD': u'0.055249'},u'Nepalese Rupee': {u'1.00 USD': u'109.959953',u'US Dollar': u'Nepalese Rupee',u'inv. 1.00 USD': u'0.009094'},u'New Zealand Dollar': {u'1.00 USD': u'1.495957',u'US Dollar': u'New Zealand Dollar',u'inv. 1.00 USD': u'0.668468'},u'Norwegian Krone': {u'1.00 USD': u'8.661961',u'US Dollar': u'Norwegian Krone',u'inv. 1.00 USD': u'0.115447'},u'Omani Rial': {u'1.00 USD': u'0.385000',u'US Dollar': u'Omani Rial',u'inv. 1.00 USD': u'2.597403'},u'Pakistani Rupee': {u'1.00 USD': u'104.604918',u'US Dollar': u'Pakistani Rupee',u'inv. 1.00 USD': u'0.009560'},u'Philippine Peso': {u'1.00 USD': u'47.606650',u'US Dollar': u'Philippine Peso',u'inv. 1.00 USD': u'0.021005'},u'Polish Zloty': {u'1.00 USD': u'3.960685',u'US Dollar': u'Polish Zloty',u'inv. 1.00 USD': u'0.252482'},u'Qatari Riyal': {u'1.00 USD': u'3.641295',u'US Dollar': u'Qatari Riyal',u'inv. 1.00 USD': u'0.274628'},u'Romanian New Leu': {u'1.00 USD': u'4.060863',u'US Dollar': u'Romanian New Leu',u'inv. 1.00 USD': u'0.246253'},u'Russian Ruble': {u'1.00 USD': u'75.913328',u'US Dollar': u'Russian Ruble',u'inv. 1.00 USD': u'0.013173'},u'Saudi Arabian Riyal': {u'1.00 USD': u'3.750501',u'US Dollar': u'Saudi Arabian Riyal',u'inv. 1.00 USD': u'0.266631'},u'Singapore Dollar': {u'1.00 USD': u'1.403737',u'US Dollar': u'Singapore Dollar',u'South African Rand': {u'1.00 USD': u'15.547001',u'US Dollar': u'South African Rand',u'inv. 1.00 USD': u'0.064321'},u'South Korean Won': {u'1.00 USD': u'1238.257908',u'US Dollar': u'South Korean Won',u'inv. 1.00 USD': u'0.000808'},u'Sri Lankan Rupee': {u'1.00 USD': u'144.195067',u'US Dollar': u'Sri Lankan Rupee',u'inv. 1.00 USD': u'0.006935'},u'Swedish Krona': {u'1.00 USD': u'8.530904',u'US Dollar': u'Swedish Krona',u'inv. 1.00 USD': u'0.117221'},u'Swiss Franc': {u'1.00 USD': u'0.994570',u'US Dollar': u'Swiss Franc',u'inv. 1.00 USD': u'1.005460'},u'Taiwan New Dollar': {u'1.00 USD': u'33.188318',u'US Dollar': u'Taiwan New Dollar',u'inv. 1.00 USD': u'0.030131'},u'Thai Baht': {u'1.00 USD': u'35.687352',u'US Dollar': u'Thai Baht',u'inv. 1.00 USD': u'0.028021'},u'Trinidadian Dollar': {u'1.00 USD': u'6.515309',u'US Dollar': u'Trinidadian Dollar',u'inv. 1.00 USD': u'0.153485'},u'Turkish Lira': {u'1.00 USD': u'2.922907',u'US Dollar': u'Turkish Lira',u'inv. 1.00 USD': u'0.342125'},u'Venezuelan Bolivar': {u'1.00 USD': u'6.320083',u'US Dollar': u'Venezuelan Bolivar',u'inv. 1.00 USD': u'0.158226'}}

您可以根据自己的喜好构建字典,但逻辑仍然相同.

如果你只是想要tablesorter:

# one specific table 
table = soup.select(".tablesorter.ratesTable")


table_data = {}
cols = [th.text for th in table[0].find_all("th")]
for tr in table[0].find_all("tr"):
        data = [td.text for td in tr.find_all("td")]
        if data:
            table_data[data[0]] = dict(zip(cols,data))

print(table_data)

输出:

{u'Argentine Peso': {u'1.00 USD': u'15.324285',u'inv. 1.00 USD': u'0.065256'},u'Australian Dollar': {u'1.00 USD': u'1.388630',u'inv. 1.00 USD': u'0.720134'},u'Brazilian Real': {u'1.00 USD': u'3.936188',u'inv. 1.00 USD': u'0.254053'},u'British Pound': {u'1.00 USD': u'0.717464',u'inv. 1.00 USD': u'1.393799'},u'Bruneian Dollar': {u'1.00 USD': u'1.403808',u'inv. 1.00 USD': u'0.712348'},u'Bulgarian Lev': {u'1.00 USD': u'1.775921',u'inv. 1.00 USD': u'0.563088'},u'Canadian Dollar': {u'1.00 USD': u'1.362506',u'inv. 1.00 USD': u'0.733942'},u'Chilean Peso': {u'1.00 USD': u'691.510617',u'inv. 1.00 USD': u'0.001446'},u'Chinese Yuan Renminbi': {u'1.00 USD': u'6.533541',u'inv. 1.00 USD': u'0.153056'},u'Colombian Peso': {u'1.00 USD': u'3313.262601',u'inv. 1.00 USD': u'0.000302'},u'Croatian Kuna': {u'1.00 USD': u'6.920610',u'inv. 1.00 USD': u'0.144496'},u'Czech Koruna': {u'1.00 USD': u'24.583134',u'inv. 1.00 USD': u'0.040678'},u'Danish Krone': {u'1.00 USD': u'6.776307',u'inv. 1.00 USD': u'0.147573'},u'Emirati Dirham': {u'1.00 USD': u'3.673148',u'inv. 1.00 USD': u'0.272246'},u'Euro': {u'1.00 USD': u'0.908120',u'inv. 1.00 USD': u'1.101176'},u'Hong Kong Dollar': {u'1.00 USD': u'7.771176',u'inv. 1.00 USD': u'0.128681'},u'Hungarian Forint': {u'1.00 USD': u'282.305073',u'inv. 1.00 USD': u'0.003542'},u'Icelandic Krona': {u'1.00 USD': u'129.154766',u'Indian Rupee': {u'1.00 USD': u'68.865641',u'inv. 1.00 USD': u'0.014521'},u'Indonesian Rupiah': {u'1.00 USD': u'13422.938587',u'inv. 1.00 USD': u'0.000074'},u'Iranian Rial': {u'1.00 USD': u'30193.236717',u'Israeli Shekel': {u'1.00 USD': u'3.903987',u'inv. 1.00 USD': u'0.256148'},u'Japanese Yen': {u'1.00 USD': u'112.709992',u'inv. 1.00 USD': u'0.008872'},u'Latvian Lat': {u'1.00 USD': u'0.638227',u'inv. 1.00 USD': u'1.566841'},u'Lithuanian Litas': {u'1.00 USD': u'3.135556',u'inv. 1.00 USD': u'0.318923'},u'Malaysian Ringgit': {u'1.00 USD': u'4.217441',u'inv. 1.00 USD': u'0.237111'},u'Mexican Peso': {u'1.00 USD': u'18.131872',u'inv. 1.00 USD': u'0.055152'},u'Nepalese Rupee': {u'1.00 USD': u'109.959303',u'New Zealand Dollar': {u'1.00 USD': u'1.494449',u'inv. 1.00 USD': u'0.669143'},u'Norwegian Krone': {u'1.00 USD': u'8.655515',u'inv. 1.00 USD': u'0.115533'},u'Philippine Peso': {u'1.00 USD': u'47.623330',u'inv. 1.00 USD': u'0.020998'},u'Polish Zloty': {u'1.00 USD': u'3.957191',u'inv. 1.00 USD': u'0.252704'},u'Qatari Riyal': {u'1.00 USD': u'3.640748',u'inv. 1.00 USD': u'0.274669'},u'Romanian New Leu': {u'1.00 USD': u'4.056672',u'inv. 1.00 USD': u'0.246507'},u'Russian Ruble': {u'1.00 USD': u'76.158926',u'inv. 1.00 USD': u'0.013130'},u'Saudi Arabian Riyal': {u'1.00 USD': u'3.749980',u'inv. 1.00 USD': u'0.266668'},u'Singapore Dollar': {u'1.00 USD': u'1.403808',u'South African Rand': {u'1.00 USD': u'15.576569',u'inv. 1.00 USD': u'0.064199'},u'South Korean Won': {u'1.00 USD': u'1239.577296',u'inv. 1.00 USD': u'0.000807'},u'Sri Lankan Rupee': {u'1.00 USD': u'144.195899',u'Swedish Krona': {u'1.00 USD': u'8.526837',u'inv. 1.00 USD': u'0.117277'},u'Swiss Franc': {u'1.00 USD': u'0.992590',u'inv. 1.00 USD': u'1.007465'},u'Taiwan New Dollar': {u'1.00 USD': u'33.191630',u'inv. 1.00 USD': u'0.030128'},u'Thai Baht': {u'1.00 USD': u'35.677099',u'inv. 1.00 USD': u'0.028029'},u'Trinidadian Dollar': {u'1.00 USD': u'6.515314',u'Turkish Lira': {u'1.00 USD': u'2.923851',u'inv. 1.00 USD': u'0.342015'},u'Venezuelan Bolivar': {u'1.00 USD': u'6.349609',u'inv. 1.00 USD': u'0.157490'}}

您可能会发现有用的是,如果您打开开发人员工具并查看样式,您将获得有关如何选择某些元素的一些提示.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读