【问题标题】:Extract all links after a particular tag using beautifulsoup使用 beautifulsoup 提取特定标签后的所有链接
【发布时间】:2021-09-16 16:13:06
【问题描述】:

我找不到关于 SO 的具体问题的答案,所以就这样吧。 假设我有一个看起来像这样的 HTML(对不起,如果它看起来有点愚蠢,我只想做一个非常简单的例子来解决我的问题):

html1 = """<html>
<head></head>
<body>
<p>Hello World!</p>
<a href='whatevs.com'>whatevs</a>
<p>Howdy!</p>
<a href='well.com'>well</a>
<div><span>haha</span><a href='haha.com'>haha</a></div>
<a href='goodbye.com'>Goodbye!</a>
</body>
</html>"""

我想提取&lt;p&gt;Howdy!&lt;/p&gt;之后的所有链接。

所以我尝试了,

howdy = BeautifulSoup(html1).find('p', text='Howdy!')

但是howdy.find_next_siblings('a')howdy.find_next('a') 都返回的东西与我想要的有点不同。

期望的输出:

[<a href="well.com">well</a>,
 <a href="haha.com">haha</a>,
 <a href="goodbye.com">Goodbye!</a>]

(实际上,它是['well','haha','Goodbye!'],但我想我可以从上面得到这个。)

理想情况下,我想要howdy.find_all('a') 之类的东西。

对不起,如果这是一个太基本的问题,但如果有人能指出正确的方向,我将不胜感激。谢谢!

【问题讨论】:

    标签: html python-3.x beautifulsoup


    【解决方案1】:

    试试:

    from bs4 import BeautifulSoup
    
    html1 = """<html>
    <head></head>
    <body>
    <p>Hello World!</p>
    <a href='whatevs.com'>whatevs</a>
    <p>Howdy!</p>
    <a href='well.com'>well</a>
    <div><span>haha</span><a href='haha.com'>haha</a></div>
    <a href='goodbye.com'>Goodbye!</a>
    </body>
    </html>"""
    
    soup = BeautifulSoup(html1, "html.parser")
    
    out, tag = [], soup.find("p", text="Howdy!")
    while True:
        tag = tag.find_next("a")
        if not tag:
            break
        out.append(tag.text)
    
    print(out)
    

    打印:

    ['well', 'haha', 'Goodbye!']
    

    【讨论】:

      【解决方案2】:

      .find_next_siblings() 就是你要找的东西:

      from bs4 import BeautifulSoup
      
      html1 = """<html>
      <head></head>
      <body>
      <p>Hello World!</p>
      <a href='whatevs.com'>whatevs</a>
      <p>Howdy!</p>
      <a href='well.com'>well</a>
      <div><span>haha</span><a href='haha.com'>haha</a></div>
      <a href='goodbye.com'>Goodbye!</a>
      </body>
      </html>"""
      
      soup = BeautifulSoup(html1, 'lxml')
      siblings = soup.find('p', text="Howdy!").find_next_siblings()
      a_tags = [sib.find('a').text if sib.name != 'a' else sib.text for sib in siblings]
      # -> ['well', 'haha', 'Goodbye!']
      

      注意:使用.find_next_siblings('a') 不会得到想要的结果,因为它不寻找内部标签。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-20
        • 1970-01-01
        • 2014-11-04
        • 1970-01-01
        • 2017-09-21
        • 2019-05-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多