1

我想废弃一个网站,特别是 tbody 下 TR 标签中的内容:

http://www.cmegroup.com/trading/products/#sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1

under <tbody> tag

有许多

<tr class = "- bandingon">
<tr class = "- bandingoff">
[...] tags

我想获取存储在每个表行(tr类)中的信息

为此,我将为 tr 类编写一些正则表达式定义:

findrows = re.compile('<tr class="-bandingon">(.*)</tr>')
findrows = re.compile('<tr class="-bandingoff">(.*)</tr>')

有没有办法将 2 组合成一个正则表达式?

4

2 回答 2

2

使用非捕获匹配组。您发布的内容还有其他问题,因为您必须处理空间差异,但只需编辑原始正则表达式,您只需要使用(?:来指示非捕获组。

findrows = re.compile('<tr class="-(?:bandingon|bandingoff)">(.*)</tr>')

如果您想更接近实际管理所有内容,您可能希望允许额外的空间(如您的示例中的那些),如下所示:

findrows = re.compile('<tr\s+class\s*=\s*[\'"]-\s*(?:bandingon|bandingoff)[\'"]\s*>(.*)</tr>')

最终,您可能想改用 BeautifulSoup 之类的东西——更灵活,边缘情况更少。

于 2013-05-18T17:19:05.770 回答
1

不要使用正则表达式。使用HTML 解析器

from bs4 import BeautifulSoup

soup = BeautifulSoup(html)

for row in soup.select('tr.bandingon, tr.bandingoff'):
    print row.get_text()

它比正则表达式更清洁、更易于使用并且更健壮。

此外,在使用抓取之前,请寻找 API。该站点有一个 JSON API,它更易于使用:

http://www.cmegroup.com/CmeWS/mvc/ProductSlate/V1/List/500/1?sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1&r=NDGWCTX4
于 2013-05-18T17:20:01.993 回答