【问题标题】:Beautiful Soup if Class "Contains" or Regex?如果类“包含”或正则表达式,那么美丽的汤?
【发布时间】:2016-04-12 03:42:15
【问题描述】:

如果我的班级名称经常不同,例如:

listing-col-line-3-11 dpt 41
listing-col-block-1-22 dpt 41
listing-col-line-4-13 CWK 12

通常我可以这样做:

for EachPart in soup.find_all("div", {"class" : "ClassNamesHere"}):
            print EachPart.get_text()

这里有太多的类名需要使用,所以其中有很多。

我知道 Python 没有我通常会使用的“.contains”,但它确实有一个“in”。虽然我还没有找到一种方法来整合它。

我希望有一种方法可以使用正则表达式来做到这一点。虽然我的 Python 语法再次让我失望,但我一直在尝试以下方面的变化:

regex = re.compile('.*listing-col-.*')
    for EachPart in soup.find_all(regex):

但这似乎并不奏效。

【问题讨论】:

    标签: python regex web-scraping beautifulsoup


    【解决方案1】:

    你可以试试这个 for 循环:

    regex = re.compile('.*listing-col-.*')
    for EachPart in soup.find_all("div", {"class" : regex}):
            print EachPart.get_text()
    

    【讨论】:

      【解决方案2】:

      您可以通过使用与gazpacho 的部分匹配来避免正则表达式...

      输入:

      html = """\
      <div class="listing-col-line-3-11 dpt 41">A</div>
      <div class="listing-col-block-1-22 dpt 41">B</div>
      <div class="listing-col-line-4-13 CWK 12">C</div>
      """
      

      部分匹配码:

      from gazpacho import Soup
      
      soup = Soup(html)
      divs = soup.find("div", {"class": "listing-col-"}, partial=True)
      [div.text for div in divs]
      

      输出:

      ['A', 'B', 'C']
      

      【讨论】:

        【解决方案3】:

        BeautifulSoup 支持CSS selectors,它允许您根据特定属性的内容选择元素。这包括用于包含的选择器 *=

        以下将返回所有 div 元素,其 class 属性包含文本“listing-col-”:

        for EachPart in soup.select('div[class*="listing-col-"]'):
            print EachPart.get_text()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-09-21
          • 2012-05-05
          • 2013-04-09
          • 2013-06-29
          • 1970-01-01
          • 2014-09-05
          • 2017-12-14
          相关资源
          最近更新 更多