python - 如何使用 Beautiful Soup 仅刮取连续的第一项
问题描述
我目前正在运行以下 python 脚本:
import requests
from bs4 import BeautifulSoup
origin= ["USD","GBP","EUR"]
i=0
while i < len(origin):
page = requests.get("https://www.x-rates.com/table/?from="+origin[i]+"&amount=1")
soup = BeautifulSoup(page.content, "html.parser")
tables = soup.findChildren('table')
my_table = tables[0]
rows = my_table.findChildren(['td'])
i = i +1
for rows in rows:
cells = rows.findChildren('a')
for cell in cells:
value = cell.string
print(value)
要从此 HTML 中抓取数据:
https://i.stack.imgur.com/DkX83.png
我遇到的问题是我正在努力只刮第一列而不刮第二列,因为它们都在标签下并且彼此位于同一表格行中。href 是唯一可以区分两个标签的东西,我尝试使用它进行过滤,但它似乎不起作用并返回一个空白值。此外,当我尝试手动对数据进行排序时,输出被垂直而不是水平修改,我是编码新手,所以任何帮助将不胜感激:)
解决方案
当您打印从顶部获得的每个项目时,例如在本例中从表格项目中打印时,更容易理解发生的情况。这个想法是一个接一个,这样你就可以跟随。
import requests
from bs4 import BeautifulSoup
origin= ["USD","GBP","EUR"]
i=0
while i < len(origin):
page = requests.get("https://www.x-rates.com/table/?from="+origin[i]+"&amount=1")
soup = BeautifulSoup(page.content, "html.parser")
tables = soup.findChildren('table')
my_table = tables[0]
i = i +1
rows = my_table.findChildren('tr')
for row in rows:
cells = row.findAll('td',class_='rtRates')
if len(cells) > 0:
first_item = cells[0].find('a')
value = first_item.string
print(value)
推荐阅读
- php - 如何防止这样的 unicode 字符Ả̴̢̦̙̬̲̯̖̲̟̟̬̲̻̣̩͕͍̦͍̮̠̤͇̿́̾͋́̾̎̔̐̓̾̐̉͒̅͛̈́̀̇͋͋̔̕͘͝͝͝ 在我的网站上以及它们为什么存在?
- javascript - 为什么 new Array(3) 函数不会在数组中返回 3 个未定义的值?
- swift - “扩展不能包含存储的属性”阻止我重构代码
- database - 有没有办法让 CURRENT_TIMESTAMP 只在数据库中存储日期、小时和分钟?
- json - 从 JSON 文件加载的字符串和 QML/QtQuick 中的动态图像创建
- gradle - JMeter - Gradle 构建失败
- docker - Jenkins 在管道上运行任何 docker 命令时出错
- mysql - 我们可以为 apache mysql 端口设置 2 个不同的端口吗?
- java - 重命名文件以按特定顺序按字母顺序排列它们?
- visual-studio-code - 在 VS Code 中自定义颜色?