# -*- coding: utf-8 -*-
import requests
import pandas as pd
from bs4 import BeautifulSoup
#from lxml import etree
#import time
#from time import sleep
url = 'http://quote.fx678.com/exchange/WH'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
response=requests.get(url,headers=headers)
soup=BeautifulSoup(response.content)
item_list=soup.find_all('td')#找到网页表格中的所有内容
num=len(item_list)
print(num)
352
names=[] #存放外汇产品的名称
price_new=[] #外汇产品的最新价格
price_change=[] #外汇产品涨跌值
price_percentage=[] #外汇产品的涨跌幅度
price_high=[] #外汇产品当日最高价
price_low=[] #外汇产品当日最低价
price_yesterday=[] #外汇产品昨日收盘价
time_update=[] #更新时间
for i in range(0,num,8):#从0位置开始,每隔7个位置就是产品名称
names.append(item_list[i].text)
for i in range(1,num,8):#从1位置开始,每隔7个位置就是产品j价格
price_new.append(item_list[i].text)
for i in range(2,num,8):#从2位置开始,每隔7个位置就是产品涨跌值
price_change.append(item_list[i].text)
for i in range(3,num,8):#从3位置开始,每隔7个位置就是产品涨跌幅度
price_percentage.append(item_list[i].text)
for i in range(4,num,8):#从4位置开始,每隔7个位置就是产品当日最高价
price_high.append(item_list[i].text)
for i in range(5,num,8):#从5位置开始,每隔7个位置就是产品当日最低价
price_low.append(item_list[i].text)
for i in range(6,num,8):#从6位置开始,每隔7个位置就是产品昨日收盘时价
price_yesterday.append(item_list[i].text)
for i in range(7,num,8):#从7位置开始,每隔7个位置就是产品价格更新时间
time_update.append(item_list[i].text)
item_dict={'names':names,'price_new':price_new,'price_change':price_change,'price_percentage':price_percentage,'price_high':price_high,\
'price_low':price_low,'price_yesterday':price_yesterday,'time_update':time_update}
df=pd.DataFrame(item_dict)
df
names | price_change | price_high | price_low | price_new | price_percentage | price_yesterday | time_update | |
---|---|---|---|---|---|---|---|---|
0 | US dollar index | -0.25 | 91.33 | 90.95 | 91.01 | -0.27% | 91.26 | 21:00:51 |
1 | EURUSD | 0.0040 | 1.2210 | 1.2146 | 1.2201 | 0.33% | 1.2161 | 21:00:51 |
2 | GBP USD | 0.0050 | 1.3992 | 1.3895 | 1.3982 | 0.36% | 1.3932 | 21:00:50 |
3 | USDJPY | -0.28 | 109.47 | 109.10 | 109.15 | -0.26% | 109.43 | 21:00:51 |
4 | AUDUSD | 0.0013 | 0.7584 | 0.7557 | 0.7578 | 0.17% | 0.7565 | 21:00:51 |
5 | USD CHF | -0.0010 | 0.9849 | 0.9817 | 0.9823 | -0.10% | 0.9833 | 21:00:50 |
6 | USD CAD | -0.0013 | 1.2871 | 1.2821 | 1.2831 | -0.10% | 1.2844 | 21:00:51 |
7 | US dollar Hong Kong dollar | 0.0011 | 7.8483 | 7.8460 | 7.8473 | 0.01% | 7.8462 | 21:00:51 |
8 | USD onshore RMB | -0.0056 | 6.3369 | 6.3185 | 6.3210 | -0.09% | 6.3266 | 21:00:08 |
9 | USD Offshore RMB | -0.0125 | 6.3315 | 6.3083 | 6.3098 | -0.20% | 6.3223 | 21:00:51 |
10 | NZDCAD | 0.0012 | 0.9093 | 0.9061 | 0.9090 | 0.13% | 0.9078 | 21:00:51 |
11 | EURNZD | 0.0016 | 1.7258 | 1.7178 | 1.7222 | 0.09% | 1.7206 | 21:00:51 |
12 | AUDJPY | -0.06 | 82.92 | 82.61 | 82.72 | -0.07% | 82.78 | 21:00:51 |
13 | AUDNZD | -0.0004 | 1.0729 | 1.0694 | 1.0697 | -0.04% | 1.0701 | 21:00:51 |
14 | AUDCAD | 0.0007 | 0.9733 | 0.9711 | 0.9723 | 0.07% | 0.9716 | 21:00:51 |
15 | CHF JPY | -0.15 | 111.39 | 110.88 | 111.14 | -0.14% | 111.29 | 21:00:51 |
16 | AUDCHF | 0.0006 | 0.7458 | 0.7435 | 0.7444 | 0.08% | 0.7438 | 21:00:51 |
17 | GBP CAD | 0.0047 | 1.7953 | 1.7860 | 1.7941 | 0.26% | 1.7894 | 21:00:51 |
18 | EUR GBP | -0.0004 | 0.8751 | 0.8697 | 0.8726 | -0.05% | 0.8730 | 21:00:51 |
19 | CAD and CHF | 0.0000 | 0.7673 | 0.7650 | 0.7656 | 0.00% | 0.7656 | 21:00:51 |
20 | Pound sterling | 0.19 | 152.73 | 151.98 | 152.64 | 0.12% | 152.45 | 21:00:51 |
21 | EURJPY | 0.12 | 133.25 | 132.69 | 133.19 | 0.09% | 133.07 | 21:00:51 |
22 | EURCHF | 0.0027 | 1.1989 | 1.1957 | 1.1984 | 0.23% | 1.1957 | 21:00:51 |
23 | NZDJPY | -0.01 | 77.44 | 77.15 | 77.33 | -0.01% | 77.34 | 21:00:51 |
24 | GBP CHF | 0.0038 | 1.3761 | 1.3684 | 1.3735 | 0.28% | 1.3697 | 21:00:51 |
25 | NZDCHF | 0.0010 | 0.6967 | 0.6934 | 0.6959 | 0.14% | 0.6949 | 21:00:51 |
26 | Canadian dollar Japanese yen | -0.12 | 85.31 | 85.01 | 85.08 | -0.14% | 85.19 | 21:00:51 |
27 | GBP AUD | 0.0036 | 1.8473 | 1.8384 | 1.8451 | 0.20% | 1.8415 | 21:00:51 |
28 | EUR AUD | 0.0024 | 1.6111 | 1.6058 | 1.6100 | 0.15% | 1.6076 | 21:00:51 |
29 | GBP NZD | 0.0027 | 1.9759 | 1.9690 | 1.9737 | 0.14% | 1.9710 | 21:00:51 |
30 | EURCAD | 0.0035 | 1.5656 | 1.5602 | 1.5655 | 0.22% | 1.5620 | 21:00:51 |
31 | US Dollar Polish Zloty | 0.0027 | 3.7395 | 3.7329 | 3.7361 | 0.07% | 3.7334 | 13:32:43 |
32 | US Dollar Mexican Peso | -0.053 | 18.894 | 18.773 | 18.794 | -0.28% | 18.847 | 21:00:51 |
33 | US Dollar Hungarian Forint | 0.41 | 275.76 | 275.29 | 275.72 | 0.15% | 275.31 | 13:32:43 |
34 | US Dollar Turkish Lira | -0.0203 | 4.0884 | 4.0580 | 4.0613 | -0.50% | 4.0816 | 21:00:51 |
35 | US Dollar South African Rand | -0.076 | 12.466 | 12.354 | 12.364 | -0.61% | 12.440 | 21:00:50 |
36 | 美元捷克朗 | 0.027 | 23.706 | 23.666 | 23.695 | 0.11% | 23.668 | 13:32:44 |
37 | 美元丹麦克朗 | -0.0195 | 6.1339 | 6.1020 | 6.1062 | -0.32% | 6.1257 | 21:00:51 |
38 | 美元挪威 | -0.0338 | 7.9927 | 7.9335 | 7.9391 | -0.42% | 7.9729 | 21:00:51 |
39 | 美元卢布 | 0.152 | 63.034 | 62.138 | 62.569 | 0.24% | 62.417 | 21:00:51 |
40 | 美元瑞典 | 0.0137 | 8.6205 | 8.5348 | 8.5787 | 0.16% | 8.5650 | 21:00:51 |
41 | 美元新币 | -0.0035 | 1.3291 | 1.3248 | 1.3254 | -0.26% | 1.3289 | 21:00:51 |
42 | 纽币美元 | 0.0016 | 0.7088 | 0.7056 | 0.7085 | 0.23% | 0.7069 | 21:00:51 |
43 | 比特币美元 | 8.77 | 4153.62 | 4019.65 | 4081.77 | 0.22% | 4073.00 | 13:38:42 |
soup.find_all()方法介绍 ,soup.find()与之基本类似,只是返回的是第一个值
find_all( name , attrs , recursive , text , **kwargs )
soup.find_all(‘b’) #查找所有的b标签,返回列表
soup.find_all(re.compile(“^b”)) # 正则表达式
soup.find_all([“a”, “b”]) #传入列表参数,找到所有的a标签和b标签
soup.find_all(id=’link2’) #传入id是link2的参数,Beautiful Soup会搜索每个tag的”id”属性
soup.find_all(href=re.compile(“elsie”)) #传入正则表达式,查找所有的href标签内容中含有 elsie 的内容
soup.find_all(href=re.compile(“elsie”), id=’link1’) # 多层过滤,除了href进行限定之外,对id标签的内容也做了限定
soup.find_all(“div”, class_=”sister”) #最常用的查找技巧,这里之所以加‘_=’是因为‘class’不仅是html中的tag,也是python语法的关键词,其他的不用加下划线
data_soup.find_all(attrs={“data-foo”: “value”}) # 针对html5里面的data- 进行的专项查找
soup.find_all(text=”Elsie”) # 对text内容进行查找
soup.find_all(text=[“Tillie”, “Elsie”, “Lacie”]) # 列表形式进行查找,与上面name类似
soup.find_all(text=re.compile(“Dormouse”)) # 正则表达式形式,与上面类似
soup.find_all(“a”, limit=2) # 找到前两个a标签, limit用来限定次数
我们在写 CSS 时,标签名不加任何修饰,类名前加点,id名前加 #,在这里我们也可以利用类似的方法来筛选元素,用到的方法是soup.select(),返回类型是list
(1)通过标签名查找
soup.select(‘title’)
(2)通过类名查找
soup.select(‘.sister’)
(3)通过 id 名查找
soup.select(‘#link1’)
(4)组合查找
组合查找即和写 class 文件时,标签名与类名、id名进行的组合原理是一样的,例如查找 p 标签中,id 等于 link1的内容,二者需要用空格分开
soup.select(‘p #link1’)
(5)属性查找
查找时还可以加入属性元素,属性需要用中括号括起来,注意属性和标签属于同一节点,所以中间不能加空格,否则会无法匹配到。
soup.select(‘a[class=”sister”]’)
soup.select(‘a[href=”http://example.com/elsie”]’)
get_text()方法可以用来获取内容,请看下面代码:
soup = BeautifulSoup(html.text, ‘lxml’)
print (type(soup.select(‘title’)))
print (soup.select(‘title’)[0].get_text()) # 获取第一个title标签的对应内容
for title in soup.select(‘title’):
print (title.get_text()) # 获取列表中的title对应内容