如何从<a href=""> tag within <div> tags with BeautifulSoup and Python?</div></a>获取信息

时间:2011-12-18 10:52:12

标签: python beautifulsoup

所有。我有一个关于BeautifulSoup with Python的快速问题。我有几个HTML看起来像这样(唯一的区别是链接和产品名称),我正试图从“href”属性获取链接。

<div id="productListing1" xmlns:dew="urn:Microsoft.Search.Response.Document">
<span id="rank" style="display:none;">94.36</span>
<div class="productPhoto">
    <img src="/assets/images/ocpimages/87684/00131cl.gif" height="82" width="82" />
</div>
<div class="productName">
    <a class="on" href="/Products/ProductInfoDisplay.aspx?SiteId=1&amp;Product=8768400131">CAPRI SUN - JUICE DRINK - COOLERS VARIETY PACK 6 OZ</a>
</div>
<div class="size">40 CT</div>

我目前有这个Python代码:

productLinks = soup.findAll('a', attrs={'class' : 'on'})
for link in productLinks:
    print link['href']

这是有效的(对于页面上的每个链接,我得到类似/Products/ProductInfoDisplay.aspx?SiteId=1&amp;Product=8768400131);但是,我一直试图弄清楚是否有办法在“href”属性中获取链接而不在“'上明确搜索'class =”。我想我的第一个问题应该是这是否是找到这些信息的最佳方式(class =“on”看起来过于通用,并且可能在将来中断,尽管我的CSS和HTML技能不是那么好)。我已经尝试了find,findAll,findAllnext等方法的多种组合,但我无法使其工作。这主要是我所拥有的(我重新安排并多次更改):

productLinks = soup.find('div', attrs={'class' : 'productName'}).find('a', href=True)

如果这不是一个好方法,我怎样才能从<a>标记转到<div class="productName">标记?如果您需要更多信息,请与我们联系。

谢谢。

3 个答案:

答案 0 :(得分:14)

好吧,一旦你拥有了<div>元素,就可以通过调用<a>来获取find()子元素:

productDivs = soup.findAll('div', attrs={'class' : 'productName'})
for div in productDivs:
    print div.find('a')['href']

但是,由于<a>位于<div>之上,您可以从div中获取a属性:

productDivs = soup.findAll('div', attrs={'class' : 'productName'})
for div in productDivs:
    print div.a['href']

现在,如果要将所有<a>元素放在列表中,上面的代码将无效,因为find()只返回一个与其条件匹配的元素。您将获得div的列表并从中获取子元素,例如,使用列表推导:

productLinks = [div.a for div in 
        soup.findAll('div', attrs={'class' : 'productName'})]
for link in productLinks:
    print link['href']

答案 1 :(得分:4)

我在BeautifulSoup4中提供此解决方案

for data in soup.find_all('div', class_='productName'):
    for a in data.find_all('a'):
        print(a.get('href')) #for getting link
        print(a.text) #for getting text between the link

答案 2 :(得分:0)

您可以通过指定索引来避免for循环。
data = soup.find_all('div', class_='productName')
a_class = data[0].find_all('a')
url_ = a_class[0].get('href')
print(url_)