从投资中查找并提取curr_id编号

时间:2016-06-12 15:30:43

标签: python web-scraping beautifulsoup bs4

我需要知道curr_id使用python提交到invest.com并提取多种货币/商品的历史数据。为此,我需要curr_id号码。如下例所示。我能够提取所有脚本。但后来我无法弄清楚如何找到包含curr_id的正确脚本索引并提取数字' 2103'。示例:我需要代码才能找到2103。

import requests
from bs4 import BeautifulSoup

url = 'http://www.investing.com/currencies/usd-brl-historical-data'
r = requests.get(url)

#URL
url='http://www.investing.com/currencies/usd-brl-historical-data'
#OPEN URL
r = requests.get(url)
#DETERMINE FORMAT
soup=BeautifulSoup(r.content,'html.parser')

#FIND TABLE WITH VALUES IN soup
curr_data = soup.find_all('script', {'type':'text/javascript'})'

UPDATE 我是这样做的:     g_data_string = STR(速度G_data)

if 'curr_id' in g_data_string: 
   print('success')

start = g_data_string.find('curr_id') + 9
end = g_data_string.find('curr_id')+13   

print(g_data_string[start:end])

但我确信有更好的方法可以做到。

2 个答案:

答案 0 :(得分:2)

您可以使用regular expression pattern作为text参数来查找特定的script元素。然后,使用相同的正则表达式在script的文本内搜索:

import re

import requests
from bs4 import BeautifulSoup

url = 'http://www.investing.com/currencies/usd-brl-historical-data'
r = requests.get(url)
soup = BeautifulSoup(r.content, 'html.parser')

pattern = re.compile(r"curr_id: (\d+)")
script = soup.find('script', text=pattern)

match = pattern.search(script.text)
if match:
    print(match.group(1))

打印2103

此处(\d+)是一个匹配一个或多个数字的捕获组

答案 1 :(得分:1)

您实际上并不需要正则表达式,您可以通过使用name=item_ID

从输入标记中提取value属性来获取ID
In [6]: from bs4 import BeautifulSoup
In [7]: import  requests

In [8]: r = requests.get("http://www.investing.com/currencies/usd-brl-historical-data").content

In [9]: soup = BeautifulSoup(r, "html.parser")

In [10]: soup.select_one("input[name=item_ID]")["value"]
Out[10]: u'2103'

您还可以查找以item_id开头的ID:

In [11]: soup.select_one("input[id^=item_id]")["value"]
Out[11]: u'2103'

或者查找带有pair_id属性的第一个div:

In [12]: soup.select_one("div[pair_id]")["pair_id"]
Out[12]: u'2103'

实际上有很多方法可以实现它。