【问题标题】:How to get all links from page in DOM?如何从 DOM 中的页面获取所有链接?
【发布时间】:2017-04-17 08:44:08
【问题描述】:

我在 Python 中使用 beautifulsoup 来获取所有链接:

links = soup.select('.cover > .card-click-target')
        print(links);

但它给了我一个包含一个元素和字符串值的数组。

我的 HTML 代码是:

<div class="cover">
  <div class="cover-image-container"> 
    <div class="cover-outer-align"> 
      <div class="cover-inner-align"> 
        <img alt="Kate Mobile Lite" class="cover-image" data-cover-large="" data-cover-small="" src="" aria-hidden="true"> 
      </div>
    </div>
  </div> 
  <a class="card-click-target" href="/s/kate_new_6" aria-label=" Kate Mobile Lite     ">
    <span class="movies preordered-overlay-container id-preordered-overlay-container" style="display:none"> 
      <span class="preordered-label">Предзаказ</span>
    </span> 
    <span class="preview-overlay-container">  </span>  
  </a> 
</div>

<div class="cover"> 
  <div class="cover-image-container">
    <div class="cover-outer-align">
      <div class="cover-inner-align"> 
        <img alt="Kate Mobile Lite" class="cover-image" data-cover-large="" data-cover-small="" src="" aria-hidden="true">
      </div>
    </div> 
  </div> 
  <a class="card-click-target" href="/s/kate_new_6" aria-label=" Kate Mobile Lite     ">
    <span class="movies preordered-overlay-container id-preordered-overlay-container" style="display:none">
      <span class="preordered-label">Предзаказ</span>
    </span>
    <span class="preview-overlay-container"> 
    </span>  
  </a>  
</div>

【问题讨论】:

  • 不查看页面的实际来源真的很难提供帮助,但如果您正在寻找链接(即a 标签),您可能应该使用find_all('a')
  • 看请再提问,我做了修改
  • 我没有看到任何变化
  • 现在我看到了更改,那里只有 1 个链接...您期望什么?
  • 是的,你可以这样做。

标签: python python-3.x beautifulsoup


【解决方案1】:
link_tags = soup.find_all('a', class_="card-click-target")
links = [i.get('href') for i in link_tags]

出来:

['/s/kate_new_6', '/s/kate_new_6']

选择版本:

link_tags = soup.select('.cover .card-click-target')
links =[i.get('href') for i in link_tags]

【讨论】:

  • 谢谢,但是如何将父级设置为? .cover &gt; card-click-target
【解决方案2】:

我不会完全相信 BeautifulSoup 中的 CSS 选择器,只是快速搜索一下你会发现 this answer here 谈到更新 BeautifulSoup 解决了他遇到的问题。

我强烈推荐你 write a function 来完成这项工作

links = soup.find_all(lambda tag: tag.parent.get('class', None) == ['cover'] \
                       and tag.get('class', None) == ['card-click-target'])

匿名 lambda 函数将搜索类为 card-click-target 的所有标签,并确保这些标签有一个类为 cover 的父标签。

【讨论】:

    【解决方案3】:

    检查这个例子:

    >>> s = """    <div class="cover">
           <div class="cover-image-container">
             <div class="cover-outer-align">
               <div class="cover-inner-align">
                 <img alt="Kate Mobile Lite" class="cover-image" data-cover-large="" data-cover-small="" src="" aria-hidden="true">
               </div>
             </div>
           </div>
           <a class="card-click-target" href="/s/kate_new_6" aria-label=" Kate Mobile Lite     ">
             <span class="movies preordered-overlay-container id-preordered-overlay-container" style="display:none">
               <span class="preordered-label">Предзаказ</span>
             </span>
             <span class="preview-overlay-container">  </span>
           </a>
         </div>
    
         <div class="cover">
           <div class="cover-image-container">
             <div class="cover-outer-align">
               <div class="cover-inner-align">
                 <img alt="Kate Mobile Lite" class="cover-image" data-cover-large="" data-cover-small="" src="" aria-hidden="true">
               </div>
             </div>
           </div>
           <a class="card-click-target" href="/s/kate_new_6" aria-label=" Kate Mobile Lite     ">
             <span class="movies preordered-overlay-container id-preordered-overlay-container" style="display:none">
               <span class="preordered-label">Предзаказ</span>
             </span>
             <span class="preview-overlay-container">
             </span>
           </a>
         </div>"""
    >>> sp = BeautifulSoup(s)
    >>> sp.select(".cover > a.card-click-target")
    [<a aria-label=" Kate Mobile Lite     " class="card-click-target" href="/s/kate_new_6">
     <span class="movies preordered-overlay-container id-preordered-overlay-container" style="display:none">
     <span class="preordered-label">?????????</span>
     </span>
     <span class="preview-overlay-container"> </span>
     </a>,
     <a aria-label=" Kate Mobile Lite     " class="card-click-target" href="/s/kate_new_6">
     <span class="movies preordered-overlay-container id-preordered-overlay-container" style="display:none">
     <span class="preordered-label">?????????</span>
     </span>
     <span class="preview-overlay-container">
     </span>
     </a>]
    
    >>> len(sp.select(".cover > a.card-click-target"))
    2
    

    【讨论】:

    • 我还是零,len(sp.select(".cover &gt; a.card-click-target"))
    • 在这个确切完整代码中?还是您使用了len(sp 部分?
    • 是的,我得到了页面的完整 HTML 代码和使用后的规则
    • 我也试过你的代码,它返回零。也许问题出在版本中?我用soup = BeautifulSoup(content, "html.parser")
    • 你用的是哪个版本的python/bs?
    猜你喜欢
    • 2018-09-04
    • 2020-02-29
    • 2023-04-02
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    相关资源
    最近更新 更多