【问题标题】:Python BeautifulSoup - Find all elements whose class names begin with some stringPython BeautifulSoup - 查找类名以某个字符串开头的所有元素
【发布时间】:2016-12-17 04:13:06
【问题描述】:

假设我们要查找所有类名都以已知字符串开头并以任意 id 号结尾的所有 li 元素。

这意味着这种方法行不通:

soup.find_all("li", {"class": KNOWN_STRING})

我也尝试过这种方法,但没有任何运气:

soup.select("li[class^="+KNOWN_STRING)

如何解决?

【问题讨论】:

  • 在这种方法soup.select("li[class^="+KNOWN_STRING) 中,您可能忘记关闭括号。试试soup.select("li[class^="+KNOWN_STRING+"]")

标签: python html string css-selectors beautifulsoup


【解决方案1】:

我会在这种方法中使用regex

import re

soup.find_all('li', {'class': re.compile(r'regex_pattern')})

因为你有一个已知的字符串但是一个任意的(我假设是未知的)数字,你可以使用正则表达式来定义你期望字符串的模式。示例:

re.compile(r'^KNOWN_STRING[0-9]+$')

这将找到所有已知字符串的末尾有一个或多个数字。有关 Python 中正则表达式的更多信息,请参阅this

编辑,回答问题:

如果 id 中有两位数字,这是否正确? soup.find_all('li', {'class': re.compile(r'^TheMatch v-1 c-[0-9][0-9]+$')})。我认为它不会。

最后两位数你会这样做:

soup.find_all('li', {'class': re.compile(r'^TheMatch v-1 c-[0-9]{2}$')})

+ 仅表示前面的一个或多个正则表达式。

我所做的是在正则表达式后面的括号 {2} 中指定我期望的实例数 2

【讨论】:

  • 如果 id 中有两位数字,这是否正确? soup.find_all('li', {'class': re.compile(r'^TheMatch v-1 c-[0-9][0-9]+$')})。我认为它不会。
  • @user3257755 我进行了编辑以回答您的问题。
【解决方案2】:

您选择不正确,只需使用 KNOWN_STRING,不要将其括在引号中并确保使用右括号:

soup.select("li[class^=KNOWN_STRING]")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2010-09-08
    • 2023-03-14
    • 2011-05-09
    • 2012-06-30
    相关资源
    最近更新 更多