Веб-выскабливание не работает?

Поэтому я искал лучшее, что мне нравится в программном обеспечении . Затем я узнал о веб-скребок я нашел это действительно удивительно, так что с моим опытом python я получил некоторые практические на некоторые красивые суп и запросы и вот код

import html5lib
import requests
from bs4 import BeautifulSoup as BS

# Get all the a strings , next siblings and next siblings
def makeSoup(urls):
    url = requests.get(urls).text
    return BS(url,"html5lib")   

def something(soup):
    for anchor in soup.findAll("a",{"data-type":"externalLink"}):
        print(anchor.string)
        next_sibling = anchor.nextSibling
        water = str(next_sibling.string)
        water = water[0:5]
        while  water != "(202)":
            next_sibling = next_sibling.nextSibling
            if next_sibling == None:
                continue
            if next_sibling.string != None:
                print(next_sibling.string)
                water = str(next_sibling.string)
                water = water[0:5]

soup = makeSoup("http://dc.about.com/od/communities/a/EmbassyGuide.htm")
something(soup)
soup = makeSoup("http://dc.about.com/od/communities/a/EmbassyGuide_2.htm")
something(soup)
soup = makeSoup("http://dc.about.com/od/communities/a/EmbassyGuide_3.htm")
something(soup)
<!-- begin snippet: js hide: false console: true babel: false -->

Но к сожалению все программисты кошмар ошибки .

Traceback (most recent call last):
  File "C:UsersRajDesktopkunal projectsPythonlisting_out_all_embassies.py", line 26, in <module>
    something(soup)
  File "C:UsersRajDesktopkunal projectsPythonlisting_out_all_embassies.py", line 17, in something
    next_sibling = next_sibling.nextSibling
AttributeError: 'NoneType' object has no attribute 'nextSibling'

What wrong is i doing and i am a newbie to programming as well as web-scraping . Так Каковы некоторые хорошие практики, которые я не следую
В любом случае.спасибо, что дочитал до конца.

1 ответ

  1. Вы должны проверитьnext_sibling == None, прежде чем вы можете использовать next_sibling.nextSiblingbreakкогда это None)

    def something(soup):
        for anchor in soup.findAll("a",{"data-type":"externalLink"}):
            print(anchor.string)
            next_sibling = anchor.nextSibling
            water = str(next_sibling.string)
            water = water[0:5]
            while  water != "(202)":
                if next_sibling == None:
                    break
                next_sibling = next_sibling.nextSibling
                if next_sibling == None:
                    break
                if next_sibling.string != None:
                    print(next_sibling.string)
                    water = str(next_sibling.string)
                    water = water[0:5]
    

    Но я мог бы написать его короче

    def something(soup):
        for anchor in soup.findAll("a",{"data-type":"externalLink"}):
            water = None  # create variable to use it first time in "while"
            while anchor and water != "(202)":
                if anchor.string:
                    print(anchor.string)
                    water = anchor.string[:5]
                anchor = anchor.nextSibling