【问题标题】:Get a tag with beautifoulsoup使用 beautifulsoup 获取标签
【发布时间】:2023-09-01 20:48:01
【问题描述】:

我想用beautifulsoup 获得标签的特定部分,但我做不到。 标签是:

<a class="grey-dark" href="/projects/perry/grace-jones-does-not-give-a-f-t-shirt-limited-edition-0/comments?cursor=4#comment-3"><data class="Comment3" data-format="distance_date" data-value="&quot;2009-04-21T15:29:45-04:00&quot;" itemprop="Comment[created_at]">on April 21, 2009</data></a>

而我想要的部分只有2009-04-21。如何使用 bs4 做到这一点?

【问题讨论】:

    标签: beautifulsoup tags


    【解决方案1】:

    我对正则表达式不是很熟练,但你可以尝试做一些类似的事情:

    import re
    [...]
    
    html = '<a class="grey-dark" href="/projects/perry/grace-jones-does-not-give-a-f-t-shirt-limited-edition-0/comments?cursor=4#comment-3"><data class="Comment3" data-format="distance_date" data-value="&quot;2009-04-21T15:29:45-04:00&quot;" itemprop="Comment[created_at]">on April 21, 2009</data></a>'
    m = re.search('[0-9]{4}-[0-9]{2}-[0-9]{2}', html)
    if m:
        print m.group(0)
    

    这将打印任何 9999-99-99 格式的字符串。重要的是要说,这个正则表达式不限制月份为 1-12 和天从 1 到 31。

    另外,您可以改用简写正则表达式\d{4}-\d{2}-\d{2}

    【讨论】:

      【解决方案2】:
      from bs4 import BeautifulSoup as bs
      
      a = '''<a class="grey-dark" href="/projects/perry/grace-jones-does-not-give-a-f-t-shirt-limited-edition-0/comments?cursor=4#comment-3"><data class="Comment3" data-format="distance_date" data-value="&quot;2009-04-21T15:29:45-04:00&quot;" itemprop="Comment[created_at]">on April 21, 2009</data></a>
      '''
      
      soup = bs(a, 'lxml')
      
      print(soup.data['data-value'])
      

      最后一行是唯一重要的,.data 是标签,或者我们可以使用soup.find('data'),我们使用属性的键来提取所需的数据。 就像我上面提到的 *er 一样,您也可以使用 re 或正则表达式,但它很慢,您必须对它有一些了解才能了解它是如何工作的,即使他解释得很好。希望这能回答您的问题。

      所以这是使用 BeautifulSoup 的正确方法,就像您要求不使用 re 一样。

      【讨论】:

        【解决方案3】:

        试一试:

        html_content='''
        <a class="grey-dark" href="/projects/perry/grace-jones-does-not-give-a-f-t-shirt-limited-edition-0/comments?cursor=4#comment-3">
        <data class="Comment3" data-format="distance_date" data-value="&quot;2009-04-21T15:29:45-04:00&quot;" itemprop="Comment[created_at]">on April 21, 2009</data></a>
        '''
        
        from bs4 import BeautifulSoup
        
        soup = BeautifulSoup(html_content,"lxml")
        item = soup.select(".Comment3")[0]['data-value'].split("T")[0]
        print(item.replace('"',''))
        

        结果:

        2009-04-21
        

        【讨论】: