簡體   English   中英

Python中的樹遍歷

[英]Tree traverse in Python

我正在嘗試編寫一個腳本來找出 python 中網頁的無響應鏈接。 在嘗試時,我發現 python 不支持多子節點。 這是真的嗎? 或者我們可以訪問多個子節點。

下面是我的代碼片段:

import httplib2
import requests
from bs4 import BeautifulSoup, SoupStrainer

status = {}
response = {}
output = {}

def get_url_status(url, count):
    global links
    links = []
    print(url)
    print(count)
    if count == 0:
        return output
    else:
        # if url not in output.keys():
        headers = requests.utils.default_headers()
        req = requests.get(url, headers)
        if('200' in str(req)):
            # if url not in output.keys():
            output[url] = '200';
            for link in BeautifulSoup(req.content, parse_only=SoupStrainer('a')):
                if 'href' in str(link):
                    links.append(link.get('href'))

            # removing other non-mandotary links
            for link in links[:]:
                if "mi" not in link:
                    links.remove(link)

            # removing same url
            for link in links[:]:
                if link.rstrip('/') == url:
                    links.remove(link)

            # removing duplicate links
            links = list(dict.fromkeys(links))
            if len(links) > 0:
                for urllink in links:
                    return get_url_status(urllink, count-1)

result = get_url_status('https://www.mi.com/in', 5)
print(result)

在這段代碼中,它只遍歷子節點的左節點並跳過休息。 像這樣的東西。 在此處輸入圖片說明

與真實相比,輸出並不令人滿意,而且非常少。

{'https://www.mi.com/in': '200', 'https://in.c.mi.com/': '200', 'https://in.c.mi.com/index.php': '200', 'https://in.c.mi.com/global/': '200', 'https://c.mi.com/index.php': '200'}

我知道,我在多個地方都缺乏,但我從來沒有做過這種規模的事情,這是我第一次。 所以如果這是一個新手問題,請原諒。

注意:我使用 mi.com 僅供參考。

乍一看,有一個明顯的問題。

if len(links) > 0:
    for urllink in links:
        return get_url_status(urllink, count-1)

這段代碼遍歷links 它在它的迭代體中有return ,這意味着它只會為鏈接中的第一項運行,並立即返回它。 還有一個錯誤。 如果函數在count達到 0 之前遇到沒有鏈接的頁面,則該函數僅返回None而不是output 。請改為執行以下操作。

if len(links):
    for urllink in links:
        get_url_status(urllink, count-1)
return output

而且if('200' in str(req))不是檢查狀態代碼的正確方法。 它將檢查正文中的子字符串“200”,而不是僅檢查狀態代碼。 應該是if req.status_code == 200

另一件事是該功能只添加響應式鏈接到output 如果要檢查無響應的鏈接,是不是要添加不返回200狀態碼的鏈接?

import requests
from bs4 import BeautifulSoup, SoupStrainer

status = {}
response = {}
output = {}

def get_url_status(url, count):
    global links
    links = []
    # if url not in output.keys():
    headers = requests.utils.default_headers()
    req = requests.get(url, headers)
    if req.status_code == 200:
        # if url not in output.keys():
        output[url] = '200'
        if count == 0:
            return output
        for link in BeautifulSoup(req.content, parse_only=SoupStrainer('a'), parser="html.parser"):
            if 'href' in str(link):
                links.append(link.get('href'))

        # removing other non-mandotary links
        for link in links:
            if "mi" not in link:
                links.remove(link)

        # removing same url
        for link in links:
            if link.rstrip('/') == url:
                links.remove(link)

        # removing duplicate links
        links = list(dict.fromkeys(links))
        print(links)
        if len(links):
            for urllink in links:
                get_url_status(urllink, count-1)
        return output

result = get_url_status('https://www.mi.com/in', 1)
print(result)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM