Skip to main content
 首页 » 编程设计

python之使用 beautifulsoup 正则表达式不会像预期的那样匹配

2025年05月04日24zhujiabin

我正在尝试使用正则表达式来匹配带有 class="calendar-days-list2"但不是 class="calendar-days-list2 prev-next-month"的标签。我加载了一段带有包含这两个选项的标签的 HTML 示例。

当我使用 re.findall() 搜索示例 HTML 时,正则表达式匹配我想要的。当我在 beautifulsoup 中使用该示例正则表达式时,它会返回想要的和不需要的类。我不明白这是为什么,有什么想法吗?谢谢!

html = '''<td id="pagestructure_0_pagecontent_0_calendar1_2016_1_7_0" class="calendar-days-list2" width="14%"> 
       <span class="date-number">7</span> 
            <p> 
              <img src="/wac/wacassets/images/icons/h1.gif" border="0"> 
              <a href="http://www.woodruffcenter.org/Commerce/MuseumAdmissions?performanceId=86514">Special Exhibitions</a> 
              10:00 AM 
            </p> 
 
          <td id="pagestructure_0_pagecontent_0_calendar1_2015_11_29_1"    class="calendar-days-list2 prev-next-month" width="14%"></td> 
       ''' 
 
soup = BeautifulSoup(html) 
# WORKS 
print re.findall(r"(calendar\-days\-list2)(?!\sprev\-next\-month)",html), "\n\n" 
 
regex = re.compile(r"(calendar\-days\-list2)(?!\sprev\-next\-month)") 
# DOESN'T WORK 
tds = soup.find_all("td", {"class": regex}) 
print tds 

输出:

# re.findall                               
['calendar-days-list2']  
 
# soup.find_all 
[<td class="calendar-days-list2"     id="pagestructure_0_pagecontent_0_calendar1_2016_1_7_0" width="14%"> 
<span class="date-number">7</span> 
<p> 
<img border="0" src="/wac/wacassets/images/icons/h1.gif"/> 
<a href="http://www.woodruffcenter.org/Commerce/MuseumAdmissions?     performanceId=86514">Special Exhibitions</a> 
        10:00 AM 
    </p> 
</td>, <td class="calendar-days-list2 prev-next-month"       id="pagestructure_0_pagecontent_0_calendar1_2015_11_29_1" width="14%"></td>] 

`

请您参考如下方法:

regex = re.compile(r"(calendar\-days\-list2)(?!\sprev\-next\-month)") 
# DOESN'T WORK 
tds = soup.find_all("td", {"class": regex}) 

这是行不通的,因为正则表达式分别应用于每个类值,而不是整个属性值。这是因为 class 是一个特殊的多值属性。最近有几个与问题相关的帖子:

可能最简单的方法是使用 CSS selector进行完整的 class 属性匹配:

soup.select('[class="calendar-days-list2"]')