欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

记一次艰难的爬虫,顺便记录一下问题

程序员文章站 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里面。

大概就是这么个意思,这个帖子主要想记录自己爬虫的经验和问题,下次就可以直接找了,因为之前写过一次,隔得时间长了就忘记了,用这个记录下来比较好