【问题标题】:Finding id with specific condition in BeautifulSoup在 BeautifulSoup 中查找具有特定条件的 id
【发布时间】:2018-02-02 08:31:52
【问题描述】:

我正在用 Python 中的 BeautifulSoup 抓取一个网站

我想找到所有a hrefid 以“des”开头(尾部有空格)+ '3-4 个字母'

我刚试过:

bsObj.findAll("a",{"id":"des "})

但它没有找到我最初想要的。

我需要使用正则表达式吗?

感谢您的所有帮助。谢谢。

<div>
    <a id="des 6TN" href="/en-kr/shop/men/11-by-boris-bidjan-saberi?lvrid=_gm_d6tn">
        11 BY BORIS BIDJAN SABERI
    </a>
    <br/>
    <a id="des R6L" href="/en-kr/shop/men/11-eleven?lvrid=_gm_dr6l">
        11 ELEVEN
    </a>
    <br/>
</div>

【问题讨论】:

    标签: python regex beautifulsoup


    【解决方案1】:

    如果你走 regex 路线,你可以像这样将编译的正则表达式模式传递给id 参数(添加一个不相关/不匹配的a 标记用于演示目的):

    from bs4 import BeautifulSoup
    import re
    ​
    soup = BeautifulSoup("""<div><a id="des 6TN" href="/en-kr/shop/men/11-by-boris-bidjan-saberi?
    lvrid=_gm_d6tn">11 BY BORIS BIDJAN SABERI</a><br /><a id="des R6L" href="/en-
    kr/shop/men/11-eleven?lvrid=_gm_dr6l">11 ELEVEN</a><a id="ds R6L" href="/en-
    kr/shop/men/11-eleven?lvrid=_gm_dr6l">11 ELEVEN</a><br />""")
    
    soup.find_all('a', id=re.compile('^des \w{3,4}$'))
    
    #[<a href="/en-kr/shop/men/11-by-boris-bidjan-saberi?
    # lvrid=_gm_d6tn" id="des 6TN">11 BY BORIS BIDJAN SABERI</a>, <a href="/en-
    # kr/shop/men/11-eleven?lvrid=_gm_dr6l" id="des R6L">11 ELEVEN</a>]
    

    【讨论】:

    • 真的很完美!非常感谢!
    【解决方案2】:

    这是另一种方式(不使用正则表达式)我不喜欢不需要它们的正则表达式。

    all_des = soup.findAll('a')
    #list of every <a> tag
    
    for i in all_des: #loops through all
        if i.has_attr('id') and i['id'].startswith('des'): 
    # check if there is an id within the <a> and if the id starts with des.
            print(i)
    

    输出:

    <a href="/en-kr/shop/men/11-by-boris-bidjan-saberi?lvrid=_gm_d6tn" id="des 6TN">
            11 BY BORIS BIDJAN SABERI
        </a>
    <a href="/en-kr/shop/men/11-eleven?lvrid=_gm_dr6l" id="des R6L">
            11 ELEVEN
        </a>
    

    希望这能回答你的问题,上面的“@Psidom”方法对你来说可能更方便,但我非常有信心 python 的内置方法比使用正则表达式更快。其中正则表达式'^des \w{3,4}$':

    **^** asserts position at start of the string des matches the characters des literally (case sensitive)

    **\w{3,4}** matches any word character (equal to [a-zA-Z0-9_])

    **{3,4}** Quantifier — Matches between 3 and 4 times, as many times as possible, giving back as needed (greedy)

    **$** asserts position at the end of the string

    【讨论】:

    • 非常感谢您的好意!而且效果非常好!
    • 谢谢你,你太客气了。我只是想确保您了解它的工作原理,而不仅仅是它的工作原理。请不要忘记检查制作耐克标志并标记您的问题的答案,无论是“Psidom”还是我的问题。此外,如果您有任何其他问题,请不要犹豫,只需在评论中输入一些内容并编辑您的问题,即如果您需要任何其他帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    • 2014-01-05
    • 2011-08-09
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多