为什么我不能使用BeautifoulSoup

时间:2017-07-26 19:50:28

标签: python-3.x web

为什么我不能使用BeautifoulSoup

深入到我想要的标签

我想从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)

如果不清楚,请告诉我,然后我会澄清更多。

1 个答案:

答案 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项。