所有。我有一个关于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&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&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">
标记?如果您需要更多信息,请与我们联系。
谢谢。
答案 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)
data = soup.find_all('div', class_='productName')
a_class = data[0].find_all('a')
url_ = a_class[0].get('href')
print(url_)