如何使用BeautifulSoup和Python从<div>标签中的<a href>标签获取信息?

14 投票
3 回答
50045 浏览
提问于 2025-04-17 08:35

大家好。我有一个关于用Python的BeautifulSoup库的小问题。我有几段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 的结果);不过,我一直在想有没有办法在不明确搜索'class="on"'的情况下获取“href”属性中的链接。我想我第一个问题应该是,这是否是获取这些信息的最佳方法(因为'class="on"'看起来太普通,未来可能会出问题,虽然我的CSS和HTML技能不是很好)。我尝试了很多组合,比如find、findAll、findAllnext等方法,但就是无法做到。这是我大致的代码(我调整和修改了很多次):

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

如果这样做不是个好方法,我该如何从 <div class="productName"> 标签获取到 <a> 标签呢?如果你需要更多信息,请告诉我。

谢谢。

3 个回答

4

你可以通过指定索引来避免使用那些 for 循环。

data = soup.find_all('div', class_='productName')
a_class = data[0].find_all('a')
url_ = a_class[0].get('href')
print(url_)
9

我将用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
22

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

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']

撰写回答