【问题标题】:regex won't match as expected using beautifulsoup正则表达式与使用 beautifulsoup 的预期不匹配
【发布时间】:2016-03-30 15:34:19
【问题描述】:

我正在尝试使用正则表达式来匹配带有 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>]

`

【问题讨论】:

  • 您的预期结果是什么?
  • 只返回带有 class="calendar-days-list2" 的 标签,例如由 soup.find_all 返回的列表中的第一个元素,而不是带有 1234562 的 标签="calendar-days-list2 prev-next-month" 就像它返回的第二个

标签: python regex beautifulsoup


【解决方案1】:
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"]')

【讨论】:

  • 谢谢alecxe!由于某种原因,soup.select() 方法仍在返回不需要的选择,该选择具有 class="calendar-days-list2 prev-next-month"
  • @SpencerSmolen 好的,请立即尝试。
猜你喜欢
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多