我今天弄了一下午修改这个代码,最后还是弄好了.原因是正则表达式的筛选不够准确,有时候是会带http:baidu这些东西的.所以需要一个正则表达式的断言,然后还有一点是如果his里面只有一个元素就不要再pop了.
最后我把代码放上去.为了突出问题我选的开始网址很特殊他没有子链接.
from urllib.request import urlopen
from bs4 import BeautifulSoup
from urllib.request import urlopen
import re
import random

base_url = "https://baike.baidu.com"
his = ["/item/%E9%B8%A1%E7%9F%A2%E8%97%A4/931175?fromtitle=%E9%B8%A1%E5%B1%8E%E8%97%A4&fromid=374872"]

for i in range(200):
url = base_url + his[-1]

print (77777777)

html = urlopen(url).read().decode('utf-8')
print (8888888888)
soup = BeautifulSoup(html, features='lxml')
print (9999999)

print(i, soup.find('h1').get_text(), ' url: ',base_url+ his[-1])

# find valid urls
sub_urls = soup.find_all("a", {"target": "_blank", "href": re.compile("(?=^/item)/item/(%.{2})+$")})

print ('爬到了'+str(i+1))
if len(sub_urls) != 0 :

his.append(random.sample(sub_urls, 1)[0]['href'])
else:
if len(his)==1:
pass
else:
# no valid sub link found
his.pop()

#到底错在了哪里???为什么多跑几遍,很小概率可能会发生1.无限重复同一个url 2.死循环 3.当然也有可能无限2个url来回跳
print ('666666')
#已经修改好了,有错误可以继续回复我

05-11 21:42