我想写一个正则表达式:
<td class="prodSpecAtribute" rowspan="2">[words]</td>
或者
<td class="prodSpecAtribute">[words]</td>
对于第二种情况,我有:
find2 = re.compile('<td class="prodSpecAtribute">(.*)</td>')
但是,我怎样才能创建一个可以使用这两个表达式中的任何一个的正则表达式
不要为此使用正则表达式,使用像 BeautifulSoup 这样的 HTML 解析器。例如:
>>> from bs4 import BeautifulSoup
>>> soup1 = BeautifulSoup('<td class="prodSpecAtribute" rowspan="2">[words]</td>')
>>> soup1.find('td', class_='prodSpecAtribute').contents[0]
u'[words]'
>>> soup2 = BeautifulSoup('<td class="prodSpecAtribute">[words]</td>')
>>> soup2.find('td', class_='prodSpecAtribute').contents[0]
u'[words]'
或查找所有匹配项:
soup = BeautifulSoup(page)
for td in soup.find_all('td', class_='prodSpecAtribute'):
print td.contents[0]
使用 BeautifulSoup 3:
soup = BeautifulSoup(page)
for td in soup.findAll('td', {'class': 'prodSpecAtribute'}):
print td.contents[0]
如果您要求使用正则表达式:
find2 = re.compile('<td class="prodSpecAtribute"( rowspan="2")?>(.*)</td>')
但我会使用 BeautifulSoup。
我既不推荐正则表达式也不推荐 BeautifulSoup。有一个项目 pyquery http://pythonhosted.org/pyquery/它使用 lxml.html 库要快得多,速度比较可以在这里找到:http: //blog.ianbicking.org/2008/03/30/ python-html-parser-performance/。根据我自己的经验,BeautifulSoup 真的很慢。
因此,在您的情况下,此代码很容易:
>>>from pyquery import PyQuery as pq
>>>page = pq('<td class="prodSpecAtribute">[words]</td>')
>>>page('.prodSpecAtribute').text()
>>>'[words]'
BS又一次真的很慢。
find2 = re.compile('<td class="prodSpecAtribute"[^>]*>(.*)</td>')
将工作。但是对于 HTML 解析有更好的解决方案......