python正则表达式在引号之间提取

时间:2012-01-13 18:27:00

标签: python regex beautifulsoup

title = str(Soup.find('td', {'id': 'bxgy_x_img'}))
title_re = re.compile('alt="(.*)"')
title_pat = re.findall(title_re, title)

出于某种原因,这不只是抓住Title,我如何让它抓住Title?

正在运行的HTML如下:

<td id="bxgy_x_img">
  <alt="Title" id="bxgy_img_a" height="75" border="0" />
</td>

4 个答案:

答案 0 :(得分:2)

问题在于*是贪婪的,这意味着它会在border="0"之后一直匹配'''。尝试使用[A-Za-z0-9]+将模式限制为字母和数字

答案 1 :(得分:1)

我认为你真正想要的更像是:

title_re = re.compile('alt="([^"]*)"')

其中[^"]表示“除双引号字符外的任何内容”。它并不严格符合HTML有效字符,我不认为(具体是新行),但它应该适用于您的目的。此外,您还需要解析HTML实体 - 例如&quot; - 如果您想捕获实际预期值。

答案 2 :(得分:0)

试试这个:

title_re = re.compile('alt="(?P<title>[A-z]*)"')

答案 3 :(得分:0)

HTML似乎已被破坏。当BeautifulSoup解析content时,它只会将<alt="Title" id="bxgy_img_a" height="75" border="0" />解释为空<alt></alt>标记:

import BeautifulSoup

content = '''\
<td id="bxgy_x_img">

<alt="Title" id="bxgy_img_a" height="75" border="0" />

</td>
'''

soup = BeautifulSoup.BeautifulSoup(content)
title = str(soup.find('td', {'id': 'bxgy_x_img'}))
print(title)

# <td id="bxgy_x_img">
# <alt>
# </alt></td>