我想从CME(芝加哥商品交易所)提取产品代码。
Q1:我以为我可以从表中提取它 - > TR。但代码只停留在交易时间的文本上。请指导我如何通过某些文本更深入地获取产品代码。
如果成功,我们应该能够看到:
CME Globex:ZC
CME ClearPort:C
结算:C
TAS:ZCT
Q2:然后不知何故,我只需要 ZC 这个词然后放入我的csv文件。
from urllib.request import urlopen as uReq
from urllib.request import Request
from bs4 import BeautifulSoup as soup
AccessCME=Request("http://www.cmegroup.com/trading/agricultural/grain-and-
oilseed/corn_contract_specifications.html",headers={"User-Agent":"Mozilla/5.0"})
CMEPage=uReq(AccessCME).read()
page_soup=soup(CMEPage,"html.parser")
table=page_soup.find("table")
rows=table.find_all("tr")
print(rows)
如果不清楚,请告诉我,然后我会澄清更多。
答案 0 :(得分:0)
我不知道为什么你得到了那张桌子的那一行。但是,我可以说你需要更加谨慎地识别你真正想要的那一行。我注意到只有一个标有包含“产品”一词的术语。我决定去寻找。我也使用了requests
模块,因为它的问题往往较少。
首先,我找到了可能的所有td
元素。然后我确定其中text
属性中包含“产品”的那个。我称之为parent_td
,确实应该是sibling_td
。我确认它包含我希望的内容。
现在我查看其他td
元素的兄弟姐妹,获取其text
属性并在每一端剥去空白区域。我将结果显示为target
。
最后,我使用了两个re.sub
调用,一个在另一个调用中,丢弃了我不想要的字符串,产生了你想要的东西。
这一切都异常尴尬。
>>> import requests
>>> page = requests.get('http://www.cmegroup.com/trading/agricultural/grain-and-oilseed/corn_contract_specifications.html').content
>>> import bs4
>>> soup = bs4.BeautifulSoup(page, 'lxml')
>>> possible_tds = soup.find_all('td', attrs={'class':"prodSpecAtribute"})
>>> parent_td = [td for td in possible_tds if 'Product' in td.text][0]
>>> parent_td
<td class="prodSpecAtribute">Product Code</td>
>>> target = parent_td.fetchNextSiblings('td')[0].text.strip()
>>> target
'CME Globex: ZCCME ClearPort: CClearing: CTAS: ZCT'
>>> import re
>>> re.sub(r'CME Globex:\s+', '', target)
'ZCCME ClearPort: CClearing: CTAS: ZCT'
>>> re.sub(r'CME ClearPort:.*', '', re.sub(r'CME Globex:\s+', '', target))
'ZC'
编辑(对评论的回应):
Q1:我几乎总是使用lxml
,因为根据我的经验,它始终有效。如果我碰巧注意到问题涉及使用其他东西,我会使用别的东西,这看起来很重要。
Q2:[td for td in possible_tds if 'Product' in td.text]
是所谓的列表理解。它有一个表达式,在本例中只是一个变量td
,一个for循环,在本例中是for td in possible_tds
,还有一个条件,在本例中是if 'Product' in td.text
。列表推导列出了由条件控制的for循环给出的表达式列表。
possible_tds
来自之前的陈述。这是td
中具有特定soup
的{{1}}元素列表。列表推导中的for循环查看这些for class
属性包含'Product'的那些。那些已添加到text
的列表中。我们知道只有一个;因此我们要求列表中的parent_td
项。