一、前言
前几天在Python钻石交流群【空】问了一个Python
网络爬虫处理的问题,一起来看看吧。他的代码如下:
from bs4 import BeautifulSoup
doc='''
<html>
<head>
<title>
The Dormouse's story
</title>
</head>
<body>
<p class="title">The Dormouse's story<b></b></p >
<p class="story">
Once upon a time there were three little sisters;and their names were
Elsie,
and
;
and they lived at bottom of a well.
</p >
<p class="story">...</p >
</body>
</html>
'''
def myFilter(tag):
print(tag.name)
return (tag.name=="a " and tag.hasattr("href") and tag["href"]=="http://example.com/lacie")
soup=BeautifulSoup(doc,"lxml")
tag=soup.find_all(myFilter)
print(tag)
但是不知道他的问题是什么,他自己也没说清楚,就只能盲猜,怪难受的。
二、实现过程
这里【甯同学】、【瑜亮老师】、【NUS吴庆农⁶⁴²-预见更好的自己】给了一个思路,如下所示:
后来发现是函数的问题:
后来【提请问粘给图截报错贴代源码】指出代码还是存在问题的,如下所示:
对症修改之后,就可以解决问题了:
论细节的重要性:
顺利地解决了粉丝的问题。
最后【NUS吴庆农⁶⁴²-预见更好的自己】给大家补充了些知识,这里与大家共勉。
1、tag.get('href')和tag['href']效果是一样的,区别是,当遇到href为空时,tag.get('href')会返回空值,不会报错退出,而tag['href']会报错退出。
2、tag['href']是提取href属性的值,包含的逻辑是①如果href有值我就提取,②如果没有值或不存在我就报错退出,所以tag['href']逻辑上已经包含了对tag有没有存在href属性的判断了,就没有必要再单独写tag.hasattr('href')了,都已经判断过了,何必再多次一举呢?这是你代码的逻辑问题。
3、BS4里有没有.hasattr()这个方法?还属于需要看说明文档确认的,我暂时手头没有电脑,不方便验证。如果没有,自己不能随便从别的地方套用过来。或许在BS4里写法是.has_attr()。所以如果方法写错了,肯定也是报错。
主要还是你代码的逻辑问题,你没仔细看两位大佬给你的他们的写法吗?不是他们非得把你写的函数去掉,是真的没必要写个函数只处理这么个小功能,而且你的函数里return的逻辑还有问题,他们的return为什么不写tag.hasattr('href')?因为tag['href']='xxxxxx'已经包含了,而且更推荐用tag.get('href')=='http://xxxx'的写法。
三、总结
大家好,我是皮皮。这篇文章主要盘点了一个Python
网络爬虫的问题,文中针对该问题,给出了具体的解析和代码实现,帮助粉丝顺利解决了问题。