Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-如何从网站检索特定文本_Python_Python 3.x_Beautifulsoup - Fatal编程技术网

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是“报价市场通知”。我知道,但我也想将此应用于其他网站,并了解更多有关网页刮取的信息。谢谢你!