[英]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.