盘点一个Python网络爬虫问题

2023-10-17 14:18:26 浏览数 (1)

一、前言

前几天在Python钻石交流群【空】问了一个Python网络爬虫处理的问题,一起来看看吧。他的代码如下:

代码语言:javascript复制
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网络爬虫的问题,文中针对该问题,给出了具体的解析和代码实现,帮助粉丝顺利解决了问题。

0 人点赞