如果类“包含”或正则表达式,那么美丽的汤?

Posted

技术标签:

【中文标题】如果类“包含”或正则表达式,那么美丽的汤?【英文标题】: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):

但这似乎并不奏效。

【问题讨论】:

【参考方案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()

【讨论】:

以上是关于如果类“包含”或正则表达式,那么美丽的汤?的主要内容,如果未能解决你的问题,请参考以下文章

美丽的汤和正则表达式

美丽的汤类型错误和正则表达式

美丽的汤正则表达式

美丽的汤正则表达列表中的Python循环[重复]

findall 正则表达式字符串使用啥漂亮的汤?

一只形神美丽且声音动听的百灵鸟--正则表达式