【问题标题】:find previous method to find url before specific class在特定类之前找到以前的方法来查找 url
【发布时间】:2020-11-21 15:03:56
【问题描述】:

我想找到 class= 'field-news-pillars' 之前的上一个标签 html 看起来像这样:

<span class="field-content"><a href="/news/building-business">Building a Business</a></span>
<div> <div>
<span class="date-display-single">Jun 29, 2020</span></div> </div>
<div> <div>
<div class="field-news-pillars">
    Entrepreneurial Spirit  </div>
</div> </div>

我要获取class="field-news-pillars" == '创业精神'上方的href链接

我知道有更简单的方法可以从 html 中找到 href 链接,但我正在尝试过滤所有链接,我只想选择 class="field-news 的前一个标签的链接——支柱”。这是我尝试过的。

last_link = soup.find(class_='field-news-pillars', text ='Entrepreneurial Spirit' )
print(last_link.find_previous('a')['href'])

error: AttributeError: 'NoneType' object has no attribute 'find_previous'

有什么想法吗?谢谢!

【问题讨论】:

    标签: python beautifulsoup href siblings


    【解决方案1】:

    find 需要一个标签名称。

    In [174]: html = """<span class="field-content"><a href="/news/building-business">Building a Business</a></span>
         ...: <div> <div>
         ...: <span class="date-display-single">Jun 29, 2020</span></div> </div>
         ...: <div> <div>
         ...: <div class="field-news-pillars">
         ...:     Entrepreneurial Spirit  </div>
         ...: </div> </div>"""
    
    In [175]: soup = BeautifulSoup(html, "html.parser")
    
    In [176]: last_link = soup.find("div", class_='field-news-pillars')
    
    In [177]: print(last_link.find_previous('a')['href'])
    /news/building-business
    

    如果要按文本过滤,

    n [189]: import re
    
    In [190]: last_link = soup.find("div", class_='field-news-pillars', text=re.compile('Entrepreneurial Spirit*'))
    
    In [191]: print(last_link.find_previous('a')['href'])
    /news/building-business
    

    【讨论】:

    • 谢谢@bigbounty,我想知道我需要用class_='field-news-pillars'过滤所有条目,我试图用(class_='field-news-柱子',文本='企业家精神'),因为在完整的html中并非所有文本属性='企业家精神',有没有办法可以在代码中留下它来过滤一些项目?
    • @AndrewLittle1 更新了我的答案。
    【解决方案2】:

    如果您有 BS4 4.7.1 或更高版本而不使用正则表达式,则使用 css 选择器获取值的另一种方法。

    html='''<span class="field-content"><a href="/news/building-business">Building a Business</a></span>
    <div> <div>
    <span class="date-display-single">Jun 29, 2020</span></div> </div>
    <div> <div>
    <div class="field-news-pillars">
        Entrepreneurial Spirit  </div>
    </div> </div>'''
    
    soup=BeautifulSoup(html,'html.parser')
    
    item1=soup.select_one('.field-news-pillars:contains("Entrepreneurial Spirit")')
    print(item1.find_previous('a')['href'])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-04
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 2021-06-25
      • 1970-01-01
      • 1970-01-01
      • 2017-03-11
      相关资源
      最近更新 更多