【问题标题】:How to find all anchor tags inside a div using Beautifulsoup in Python如何在 Python 中使用 Beautifulsoup 查找 div 内的所有锚标签
【发布时间】:2016-05-30 00:28:55
【问题描述】:

这就是我正在解析的 HTML 的样子。它都在一个表中并且被重复多次,我只想要 div 内的href 属性值,属性为class="Special_Div_Name"。然后所有这些 div 都在表格行内,并且有很多行。

<tr>
   <div class="Special_Div_Name">
      <a href="something.mp3">text</a>
   </div>
</tr>

我想要的只是以“.mp3”结尾的href 属性值,它们位于具有class="Special_Div_Name" 属性的div 内。

到目前为止,我能够想出这段代码:

download = soup.find_all('a', href = re.compile('.mp3'))
for text in download:
    hrefText = (text['href'])
    print hrefText

此代码当前打印出页面上以“.mp3”结尾的每个href 属性值,并且非常接近于我想要的。只是我只想要那个 div 类中的“.mp3”。

【问题讨论】:

    标签: python html python-2.7 web-scraping beautifulsoup


    【解决方案1】:

    这个微小的调整应该会得到你想要的:

    special_divs = soup.find_all('div',{'class':'Special_Div_Name'})
    for text in special_divs:
        download = text.find_all('a', href = re.compile('\.mp3$'))
        for text in download:
            hrefText = (text['href'])
            print hrefText
    

    【讨论】:

    • 这工作完美且合乎逻辑,所以我有点理解它是如何工作的!唯一的问题是我很难弄清楚如何在我的代码中实现它,因为你只使用了“d”作为变量,而我用 d.find_all() 错过了这个,所以也许可以更好地命名,这样未来的人们就不会错过它也是。
    • 好电话!我会换回来的。乐于助人:)
    • re.compile('.mp3') 将匹配 &lt;a href="textmp3"&gt;text&lt;/a&gt;;你想要re.compile('\.mp3$'),因为.在正则表达式中具有特殊含义;锚点$ 表示它应该匹配字符串的结尾。
    • 谢谢,我认为那里出了点问题,但 OP 说这对他的例子有用 :)
    • @JoshCrozier 是的,在这种情况下使用它会更好!我会切换我的代码来使用它,谢谢!
    【解决方案2】:

    由于 Beautiful Soup 接受大多数 CSS selectors.select() method,我建议使用 attribute selector [href$=".mp3"] 以选择带有 href 属性以 .mp3 结尾的 a 元素。

    然后你可以在前面加上选择器.Special_Div_Name,以便只选择作为后代的锚元素:

    for a in soup.select('div.Special_Div_Name a[href$=".mp3"]'):
        print (a['href'])
    

    在更一般的情况下,如果您只想选择具有[href] 属性且是div 元素的后代的a 元素,那么您可以使用选择器div a[href]

    for a in soup.select('div a[href]'):
        print (a)
    

    如果您不使用上面的代码,那么根据您提供的原始代码,您需要选择所有具有Special_Div_Name 类的元素,然后您需要遍历这些元素并选择后代锚元素:

    for div in soup.select('.Special_Div_Name'):
        for a in div.find_all('a', href = re.compile('\.mp3$')):
            print (a['href'])
    

    附带说明,re.compile('.mp3') 应该是re.compile('\.mp3$'),因为. 在正则表达式中具有特殊含义。此外,您还需要锚点 $ 以匹配字符串的末尾(而不是字符串中的任何位置)。

    【讨论】:

    • 选择器应该是最优的吧?我认为循环很清楚,但选择器理论上应该少循环。
    • 这或多或少是我所做的,但在我看到你的之前,我先遵循了其他人的解决方案。我想你的也可以。感谢您的帮助!
    • @ddschmitz 查看我在底部添加的注释; re.compile('.mp3') 实际上应该是 re.compile('\.mp3$'),因为 . 是正则表达式中的一个特殊字符。您还需要 $ 锚点,因为您想匹配字符串的结尾。
    猜你喜欢
    • 1970-01-01
    • 2021-12-09
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 2019-10-08
    • 1970-01-01
    相关资源
    最近更新 更多