【问题标题】:Is it possible for BeautifulSoup to work in a case-insensitive manner?BeautifulSoup 是否可以以不区分大小写的方式工作?
【发布时间】:2011-02-05 20:09:57
【问题描述】:

我正在尝试为提取的网页提取元描述。但是在这里我面临着 BeautifulSoup 区分大小写的问题。

因为有些页面有<meta name="Description,有些有<meta name="description

我的问题和Question on Stackoverflow的问题很相似

唯一的区别是我不能使用 lxml .. 我必须坚持使用 Beautifulsoup。

【问题讨论】:

标签: python beautifulsoup


【解决方案1】:

你可以给 BeautifulSoup 一个正则表达式来匹配属性。类似的东西

soup.findAll('meta', name=re.compile("^description$", re.I))

可能会成功。抄自the BeautifulSoup docs

【讨论】:

    【解决方案2】:

    正则表达式?现在我们有another problem

    相反,您可以传入一个 lambda:

    soup.findAll(lambda tag: tag.name.lower()=='meta',
        name=lambda x: x and x.lower()=='description')
    

    x and 避免在标签未定义name 属性时出现异常)

    【讨论】:

    • 使用 bs4 我得到“find_all() got multiple values for keyword argument 'name'”:/
    • @Joaolvcm “你 can’t use 一个关键字参数来搜索 HTML 的 ‘name’ 元素,因为 Beautiful Soup 使用 name 参数来包含标签本身的名称。相反,您可以在 attrs 参数中为‘name’赋值。” TL;DR:soup.find_all(lambda tag: ..., {"name": lambda x: ...}).
    【解决方案3】:

    稍作改动即可使用。

    soup.findAll('meta', attrs={'name':re.compile("^description$", re.I)})
    

    【讨论】:

      【解决方案4】:

      使用 bs4 使用以下内容:

      soup.find('meta', attrs={'name': lambda x: x and x.lower()=='description'})
      

      【讨论】:

        【解决方案5】:

        最好还是使用带有 i 参数的 css attribute = value 选择器以不区分大小写

        soup.select('meta[name="description" i]')
        

        【讨论】:

          【解决方案6】:

          更改 html 页面源代码的大小写。使用string.lower()、string.upper()等函数

          【讨论】:

          • 你为什么这么认为
          • 我不是在问问题。我正在回答问题
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-08
          • 1970-01-01
          • 1970-01-01
          • 2010-12-24
          相关资源
          最近更新 更多