请教 BeautifulSoup 语法的问题

2017-09-04 19:42:25 +08:00
 saximi

以下代码用于从 http://buy.ccb.com/ 网站爬取手机栏目的地址,在 while 模块中逐个提取链接并判断该链接的说明文字是否为“手机”,是的话就返回该链接,否则继续提取其余链接, 如果链接都遍历完毕还没找到,则在 try 模块中捕捉该异常并返回 None。

from urllib.request import urlopen   
from bs4 import BeautifulSoup    
import re   
    
baseUrl="http://buy.ccb.com/" 
def getMobileLinks(articleUrl):   
    html = urlopen(baseUrl+articleUrl)   
    bsObj = BeautifulSoup(html,'lxml')   
    isFound = 0 
    url = bsObj.find("div", {"class":"lists"}).find("a", href=True)  
    while isFound == 0 : 
        print("a=",url)  
        h=re.search(r'手机', ''.join(url)) 
        if h != None : 
            isFound = 1  
            return url.attr("href") 
        else: 
            try: 
                url = bsObj.find("div", {"class":"lists"}).find_next("a", href=True)   #语句 1 
            except Exception as e:      #语句 2 
                print("Not Found!",e) 
                return None 
         
links = getMobileLinks("")   
print('links=',links)  

上面代码反复输出如下一行内容: 
a= http://buy.ccb.com/searchproducts/pv_0_0_0_0.jhtml?hotKeySize=6&hotMerchantList=%24hotMerchantList.size%28%29&catId=&selectCatId=&qa=&query=APPLE " style="margin: 0px 3px 0px 0px;" target="_blank">苹果 


我的问题如下: 
1、语句 1 用于获取 BeautifulSoup 找到的下一个"a"标签对象,虽然执行没有报错但是出现了死循环,看来是 find_next 找下一个"a"标签对象的语法不对,请问正确的语法应该如何写呢? 

2、语句 2 的本意是在 BeautifulSoup 返回的"a"标签对象都遍历完毕时报错,但是不知道没有"a"标签对象可找时会抛出什么异常? 
恳请大家指点,感谢! 

1675 次点击
所在节点    Python
3 条回复
Trim21
2017-09-05 08:35:22 +08:00
用 Soup.find_all()找到所有的 a 标签,然后针对所有的标签遍历。
quinoa42
2017-09-05 12:57:46 +08:00
saximi
2017-09-05 22:49:17 +08:00
@quinoa42 看了这个材料,但是好像没有提到 find_next 如果没有结果可找时会返回什么错误呢?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/388138

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX