如何在Python中使用Beautifulsoup查找div中的所有锚标签

dds*_*itz 5 html python beautifulsoup web-scraping python-2.7

这就是我的HTML看起来我正在解析的方式.它都在一个表中,并且重复多次,我只想要hrefdiv中带有属性的属性值class="Special_Div_Name".然后所有这些div都在表行内,并且有很多行.

<tr>
   <div class="Special_Div_Name">
      <a href="something.mp3">text</a>
   </div>
</tr>
Run Code Online (Sandbox Code Playgroud)

我想要的只是href以".mp3"结尾的属性值,它们在带有属性的div中class="Special_Div_Name".

到目前为止,我能够提出这个代码:

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

此代码当前打印出href以".mp3"结尾的页面上的每个属性值,并且非常接近于完全按照我的意愿行事.它只是我只想要div类中的".mp3".

rof*_*fls 8

这个小调整可以让你得到你想要的:

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
Run Code Online (Sandbox Code Playgroud)


Jos*_*ier 5

由于Beautiful Soup 使用该方法接受大多数CSS选择器,因此我建议使用属性选择器来选择属性以.结尾的元素..select() [href$=".mp3"]ahref.mp3

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

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

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

for a in soup.select('div a[href]'):
    print (a)
Run Code Online (Sandbox Code Playgroud)

如果您不使用上面的代码,那么根据您提供的原始代码,您需要选择具有类的所有元素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'])
Run Code Online (Sandbox Code Playgroud)

作为旁注,re.compile('.mp3')应该是re.compile('\.mp3$')因为.在正则表达式中具有特殊含义.此外,您还需要锚点$以便在sting结尾处匹配(而不是在字符串中的任何位置).