मैं पायथन में एक नौसिखिया हूं और मैं निम्नलिखित कोड की पठनीयता और प्रदर्शन को बेहतर बनाने के लिए कुछ दिशानिर्देशों और सलाह की सराहना करता हूं, विशेष रूप से पंक्तियों 8 से 11

import requests
from bs4 import BeautifulSoup

URL = 'https://docs.google.com/forms/d/e/1FAIpQLSd5tU8isVcqd02ymC2n952LC2Nz_FFPd6NT1lD4crDeSsJi2w/viewform?usp=sf_link'
page = requests.get(URL)
soup = BeautifulSoup(page.content, 'html.parser')

question1 = str(soup.find(id='i1'))
question1 = question1.split('>')[1].lstrip().split('.')[1]
question1 = question1[1:]
question1 = question1.replace("_", "")

print(question1)

मैं वास्तव में पठनीयता, प्रदर्शन और सर्वोत्तम अभ्यास में कोड को बेहतर बनाने के लिए कुछ फीडबैक की सराहना करता हूं।

धन्यवाद

0
Abhinav Prabhakar 29 पद 2020, 09:34

2 जवाब

सबसे बढ़िया उत्तर

अभिनव, बहुत स्पष्ट नहीं है कि आप क्या हासिल करना चाहते हैं, स्क्रिप्ट वास्तव में पहले से ही बहुत सरल है जो एक अच्छी बात है और पायथन का ज़ेन:

"सरल जटिल से बेहतर है।"

यह भी व्यापक नहीं है कि आपका वास्तव में क्या मतलब है:

  1. मनुष्य के लिए समझने योग्य और स्पष्ट के रूप में इसे और अधिक सरल बनाएं?
  2. मशीन के लिए इसकी गणना करना अधिक आसान बनाएं, इसलिए प्रदर्शन में सुधार करें?
  3. कोड की लाइन कम करें और प्रोग्रामिंग दिशानिर्देशों का अधिक पालन करें?

मैं इसे इंगित करता हूं क्योंकि अगली बार प्रश्न में इसे और अधिक स्पष्ट करना बेहतर होगा, क्योंकि मुझे नहीं पता कि आपका क्या मतलब है, मैं एक उत्तर के साथ आया हूं कि कमोबेश सभी 3 बिंदुओं को कवर करता है :


उत्तर

import requests
from bs4 import BeautifulSoup

URL = 'https://docs.google.com/forms/d/e/1FAIpQLSd5tU8isVcqd02ymC2n952LC2Nz_FFPd6NT1lD4crDeSsJi2w/viewform?usp=sf_link'
page = requests.get(URL)
soup = BeautifulSoup(page.content, 'html.parser')

# ========= < FUNCTION TO GET ALL QUESTION DYNAMICALLY > ========= #
def clean_string_by_id(page, id):

    content = str(page.find(id=id))  # Get Content of page by different ids
    if content != 'None':  # Check if there is actual content or not
        find_question = content.split('>')  # NOTE: Split at tags closing
        if len(find_question) >= 2 and find_question[1][0].isdigit():  # NOTE: If len is 1 means that is not the correct element Also we check if the first element is a digit means that is correct
            cleaned_question = find_question[1].split('.')[1].strip()  # We get the actual Question and strip it already !
            result = cleaned_question.replace('_', '')
            return result
    else:
        return


# ========= < Scan the entire page Dynamically + add result to a list> ========= #
all_questions = []
for i in range(1, 50): # NOTE: I went up to 50 but there may be many more, I let you test it
    get_question = clean_string_by_id(soup, f'i{i}')
    if get_question:  # Append result to list only if there is actual content
        all_questions.append(get_question)

# ========= < show all results > ========= #
for question in all_questions:
    print(question)

नोट

यहाँ मैं मान रहा हूँ कि आप इस पृष्ठ से सभी तत्व प्राप्त करना चाहते हैं, इसलिए आप 2000 चर नहीं लिखना चाहते हैं, जैसा कि आप देख सकते हैं कि मैंने तर्क को मूल रूप से आपके जैसा ही छोड़ दिया था, लेकिन मैंने इसके बजाय एक फ़ंक्शन में सब कुछ लपेट लिया।

वास्तव में आपके द्वारा अनुसरण किए जाने वाले कदम बहुत अच्छे थे और हाँ आप इसे "सुधार" सकते हैं या इसे "स्मार्ट" बना सकते हैं, हालांकि समझने योग्य जटिलता जीतता है। यह भी ध्यान रखें कि मैंने मान लिया कि उस Google फ़ॉर्म से सभी 'प्रश्न' प्राप्त करना आपका लक्ष्य था।


संपादित करें

जैसा कि @wuerfelfreak द्वारा बताया गया है और जैसा कि उन्होंने अपने answer में बताया है, getText() फ़ंक्शन

इसलिए यहाँ getText का उपयोग करके उपरोक्त फ़ंक्शन का परिणाम है:

def clean_string_by_id(page, id):

    content = page.find(id=id)
    if content:  # NOTE: Check if there is actual content or not, same as if len(content) >= 0
        find_question = content.getText()     # NOTE: Split at tags closing
        if find_question:   # NOTE: same as do if len(findÑ_question) >= 1: ... If is 0 means that is a empty line so we skip it
            cleaned_question = find_question.split('.')[1].strip()  # Same as before
            result = cleaned_question.replace('_', '')
            return result

दस्तावेज़ीकरण और मार्गदर्शिकाएँ

2
Federico Baù 29 पद 2020, 14:38

आप निम्नलिखित का उपयोग कर सकते हैं:

question1 = soup.find(id='i1').getText().split(".")[1].replace("_","").strip()

लाइनों 8 से 11 को बदलने के लिए।

.getText() html-tags को हटाने का काम करता है। आराम काफी हद तक समान है।

अजगर में आप हमेशा सिर्फ चेन ऑपरेशंस कर सकते हैं। तो आपका कोड भी एक-लाइनर मान्य होगा:

question1 = str(soup.find(id='i1')).split('>')[1].lstrip().split('.')[1][1:].replace("_", "")

लेकिन ज्यादातर मामलों में लाइन-काउंट को कम करने की तुलना में कोड को अधिक पठनीय रूप में छोड़ना बेहतर होता है।

2
wuerfelfreak 29 पद 2020, 10:00