记一次艰难的爬虫,顺便记录一下问题
程序员文章站
2022-06-12 19:42:02
...
今天写了一个爬虫,大手子看来可能很简单,但是对我这样的渣渣而言已经竭尽全力了。。。
先贴上代码
import requests
from bs4 import BeautifulSoup
def getCountries(url):
page = requests.get(url)
page.encoding = "utf-8"
content = page.text #get content from url
soup = BeautifulSoup(content, "html.parser")
span = soup.find_all("span", class_= "mw-headline")[0 : 7]
continents = [s.text for s in span]
print (continents)
ul = soup.find_all("ul")[1:8]
li = []
countries = []
for i in range(len(ul)):
li.append(ul[i].select("li"))
temp = []
for j in range(len(li[i])):
country = (((ul[i].select("li"))[j].text).split())[0]
temp.append(country)
countries.append(temp)
countries.insert(1, [])
countries[-2].extend(countries[-1])
countries.pop()
countries_continents = {}
for i in range(len(countries)):
countries_continents[continents[i]] = countries[i]
print (countries_continents['Africa'])
那么接下来说说题目要求:
题目很简单,EnglishWikipedia上面获取国家和大陆信息。
分析html以后发现所有的国家信息存在于ul标签下的li标签下的a标签里
大陆信息存在于span标签
想记录的有几个点:
1.根据标签的id或者class寻找html标签的方法:
span = soup.find_all("span", class_= "mw-headline")
这里用了find_all函数,前面的“span”是标签名,用class找后面就加class的值,用id找后面就加id的值;
2..select()的使用
寻找子标签费了我不少力气,因为两个嵌套,全是数组,最容易出现的问题就是提醒你list没有text属性,或者没有select属性,这个时候就是用的两层嵌套循环来访问ul或者li中的每个标签;
3.数组越界问题
这个是个老生常谈的话题了,这次数组越界的问题在于我想给countries[i]直接使用append方法,但是行不通,具体原因我到最后也没搞懂,后来是把国家名称赋值给了另外一个临时数组temp然后用temp 来 append到countries里面。
大概就是这么个意思,这个帖子主要想记录自己爬虫的经验和问题,下次就可以直接找了,因为之前写过一次,隔得时间长了就忘记了,用这个记录下来比较好