2014-03-13 31 views
2

我正在研究一个python脚本来做一些网页报废。我想找到一个网页上给定的部分看起来像这样的基地网址:改善一个python片段

<div class='pagination'> 
    <a href='webpage-category/page/1'>1</a> 
    <a href='webpage-category/page/2'>2</a> 
    ... 
</div> 

所以,我只需要得到一切从第一HREF除号(“网页类别/页/ “),我有以下工作代码:

pages = [l['href'] for link in soup.find_all('div', class_='pagination') 
    for l in link.find_all('a') if not re.search('pageSub', l['href'])] 

s = pages[0] 
f = ''.join([i for i in s if not i.isdigit()]) 

的问题是,产生这个名单是一种浪费,因为我只需要第一个HREF。我认为发电机将是答案,但我无法解决这个问题。也许你们可以帮我让这段代码更简洁?

回答

2

这个什么:

from bs4 import BeautifulSoup 

html = """ <div class='pagination'> 
    <a href='webpage-category/page/1'>1</a> 
    <a href='webpage-category/page/2'>2</a> 
</div>""" 

soup = BeautifulSoup(html) 

link = soup.find('div', {'class': 'pagination'}).find('a')['href'] 

print '/'.join(link.split('/')[:-1]) 

打印:

webpage-category/page 

仅供参考,谈论你所提供的代码 - 您可以使用[下一个()] [ - 1],而不是列表理解:

s = next(l['href'] for link in soup.find_all('div', class_='pagination') 
     for l in link.find_all('a') if not re.search('pageSub', l['href'])) 

UPD(使用提供的网站链接):

import urllib2 
from bs4 import BeautifulSoup 


url = "http://www.hdwallpapers.in/cars-desktop-wallpapers/page/2" 
soup = BeautifulSoup(urllib2.urlopen(url)) 

links = soup.find_all('div', {'class': 'pagination'})[1].find_all('a') 

print next('/'.join(link['href'].split('/')[:-1]) for link in links 
      if link.text.isdigit() and link.text != "1") 
+0

好吧,你差不多了。但实际上该页面有两个'分页'div,其中一个具有以下结构('网页类别/ pageSub/1')。这个对我不感兴趣,所以我通过重新丢弃它。你可以将所有这些分配到一个班轮吗? – XVirtusX

+0

@XVirtusX好的,当然。你能告诉我相关的html或网站的链接吗?我很确定,这个任务可以用比'href'使用正则表达式过滤链接更清洁的方式来完成。谢谢。 – alecxe

+0

网站:http://www.hdwallpapers.in/cars-desktop-wallpapers/page/2 – XVirtusX