Python-如何从网站检索特定文本
我有以下代码:Python-如何从网站检索特定文本,python,python-3.x,beautifulsoup,Python,Python 3.x,Beautifulsoup,我有以下代码: import requests from bs4 import BeautifulSoup import urllib.request import urllib.parse import re market = 'INDU:IND' quote_page = 'http://www.bloomberg.com/quote/' + market page = urllib.request.urlopen(quote_page) soup = BeautifulSoup(pag
import requests
from bs4 import BeautifulSoup
import urllib.request
import urllib.parse
import re
market = 'INDU:IND'
quote_page = 'http://www.bloomberg.com/quote/' + market
page = urllib.request.urlopen(quote_page)
soup = BeautifulSoup(page, 'html.parser')
name_box = soup.find('h1', attrs={'class': 'name'})
name = name_box.text.strip()
print('Market: ' + name)
这段代码有效,让我可以从url获取市场名称。我正在尝试做一些类似的网站。这是我的密码:
market = 'BTC-GBP'
quote_page = 'https://uk.finance.yahoo.com/quote/' + market
page = urllib.request.urlopen(quote_page)
soup = BeautifulSoup(page, 'html.parser')
name_box = soup.find('span', attrs={'class': 'Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)'})
name = name_box.text.strip()
print('Market: ' + name)
我不知道该怎么办。我想检索当前汇率,即以数字和百分比的形式增加/减少的金额。最后,当信息更新时。我该怎么做呢?我不介意你用一种和我以前用的不同的方法,只要你解释一下。如果我的代码效率不高/没有音速,请您也告诉我如何修复此问题。我对网页抓取和这些新模块还很陌生。谢谢 您可以直接使用雅虎财经提供的api, 参考此答案:-
您可以使用BeautifulSoup,在搜索所需数据时,使用正则表达式匹配由站点后端脚本生成的动态跨度类名:
from bs4 import BeautifulSoup as soup
import requests
import re
data = requests.get('https://uk.finance.yahoo.com/quote/BTC-GBP').text
s = soup(data, 'lxml')
d = [i.text for i in s.find_all('span', {'class':re.compile('Trsdu\(0\.\d+s\) Trsdu\(0\.\d+s\) Fw\(\w+\) Fz\(\d+px\) Mb\(-\d+px\) D\(\w+\)|Trsdu\(0\.\d+s\) Fw\(\d+\) Fz\(\d+px\) C\(\$data\w+\)')})]
date_published = re.findall('As of\s+\d+:\d+PM GMT\.|As of\s+\d+:\d+AM GMT\.', data)
final_results = dict(zip(['current', 'change', 'published'], d+date_published))
输出:
{'current': u'6,785.02', 'change': u'-202.99 (-2.90%)', 'published': u'As of 3:55PM GMT.'}
{'current': u'175.50', 'change': u'+3.00 (+1.74%)', 'published': u'At close: 4:00PM EST'}
编辑:给定新的URL,您需要更改span类名称:
data = requests.get('https://uk.finance.yahoo.com/quote/AAPL?p=AAPL').text
final_results = dict(zip(['current', 'change', 'published'], [i.text for i in soup(data, 'lxml').find_all('span', {'class':re.compile('Trsdu\(0\.\d+s\) Trsdu\(0\.\d+s\) Fw\(b\) Fz\(\d+px\) Mb\(-\d+px\) D\(b\)|Trsdu\(0\.\d+s\) Fw\(\d+\) Fz\(\d+px\) C\(\$data\w+\)')})] + re.findall('At close:\s+\d:\d+PM EST', data)))
输出:
{'current': u'6,785.02', 'change': u'-202.99 (-2.90%)', 'published': u'As of 3:55PM GMT.'}
{'current': u'175.50', 'change': u'+3.00 (+1.74%)', 'published': u'At close: 4:00PM EST'}
您想要的输出是当前速率。但我也希望它能够输出市场的增加/减少的百分比和数字,这两个都在网站上。以及信息上传到网站的时间。非常感谢!我必须用pip安装lxml,但在那之后它就工作了。嘿,当我将url的结尾从BTC-GBP更改为AAPL?p=AAPL时,as of位不在字典中。你知道为什么吗?经过进一步测试后,一些测试结果已于。。。有些则不然。你能告诉我怎么修理这个吗?谢谢@RandomPerson1234554321带有新添加内容的链接呈现具有不同
span
类名的a页面。请看我最近的编辑。它仍在打印:{'current':'178.890','change':'+3.390(+1.932%)}。我想在网站上看到的文字是这样写的:“截止美国东部时间上午11:57。”。市场开放。该类='C($C-fuji-grey-j)D(b)Fz(12px)Fw(n)Mstart(0)--mobpsm Mt(6px)--mobpsm,ID是“报价市场通知”。我知道,但我也想将此应用于其他网站,并了解更多有关网页刮取的信息。谢谢你!