【问题标题】:Beautiful Soup - Get all elements美丽的汤 - 获取所有元素
【发布时间】:2021-05-03 20:03:19
【问题描述】:

Beautiful Soup 的新手将不胜感激。

我正在处理一个包含很多内容的页面:

<p data-v-04dd08f2> .. </p>

元素。 p 里面是一个字符串值,我需要它和一个嵌入的跨度。

问题可能很简单...我正在尝试使用 find_all 来“获取”所有这些元素的列表,随后我将解析这些元素以从内部获取我需要的令牌。

谁能让我摆脱痛苦并告诉我应该如何构建 find_all 来获得这些?

我试过了:

find_all('p',{'data':'v-04dd08f2'} } # nope
find_all('p', {"attributes': 'v-04dd08f2'} ) # nope

还有很多其他的组合都无济于事。

谢谢!

【问题讨论】:

    标签: python beautifulsoup screen-scraping


    【解决方案1】:

    如果您愿意改用 CSS 选择器,我个人更喜欢 BeautifulSoup 的 find_* 方法,并且段落标签实际上正是您所指出的,“data-v-04dd08f2”是标签的一个属性,那么以下应该可以解决问题

    from bs4 import BeautifulSoup
    
    soup = BeautifulSoup('<p data-v-04dd08f2> .. </p>')
    p_tags = soup.select('p[data-v-04dd08f2]')
    print(p_tags)
    #[<p data-v-04dd08f2=""> .. </p>]
    

    bs4 使用 SoupSieve 来实现 CSS 选择器。基于属性选择的 SoupSieve 文档是 here。请注意,根据您的尝试,我怀疑您实际上可能正在寻找具有数据属性 = 'v-04dd08f2' 的 p 标签。如果是这种情况,soup.select 字符串应该是 soup.select('p[data=v-04dd08f2]')

    【讨论】:

      【解决方案2】:

      这将返回所有属性名称以 "data-v-"

      开头的元素
      match_pattern = 'data-v-'
      m = soup.findAll(lambda tag: any(attr.startswith(match_pattern) for attr in tag.attrs.keys()))
      

      element.attrs是键值结构,{attribute_name:attribute_value}

      【讨论】:

        猜你喜欢
        • 2021-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-20
        • 2019-02-18
        • 2022-11-30
        • 1970-01-01
        相关资源
        最近更新 更多