[Python] Eine Funktion, die die Breite ausrichtet, indem ein Leerzeichen in Text eingefügt wird, das eine Mischung aus voller und halber Breite ist

Einführung

Ich habe ein Programm geschrieben, um eine Liste mit Überschriften und URLs von der Yahoo News-Website abzurufen und jedes Element in einer Zeile anzuzeigen, aber ich hatte ein wenig Schwierigkeiten, die URL-Spalten für die Zukunft ordentlich auszurichten Ich werde einen Artikel in schreiben.

Holen Sie sich die Daten von den folgenden Websites. 2020-10-15_09h07_43.png

Der endgültige Text lautet wie folgt. 2020-10-15_09h13_18.png

Entwicklungsumgebung

Verwenden Sie Python 3.7. Die Entwicklungsumgebung ist Visual Studio Community 2019.

Code

import requests
import unicodedata
from urllib.parse import urljoin
from bs4 import BeautifulSoup

def main():
    base_url = 'https://news.yahoo.co.jp/'
    categories = {
        'Haupt': '',
        'Inländisch': 'categories/domestic',
        #'Unterhaltung': 'categories/entertainment',
        #'International': 'categories/world',
        #'Wirtschaft': 'categories/business',
        }

    #Schleifenverarbeitung nach Kategorie
    for cat in categories:
        url = urljoin(base_url, categories[cat])

        r = requests.get(url)
        soup = BeautifulSoup(r.content, 'lxml') # html.parser

        ul_tag = soup.find('div', class_='topicsList')\
                     .find('ul', class_='topicsList_main')

        print(f'==={cat}===')

        for item in ul_tag.find_all('li', class_='topicsListItem'):
            a = item.find('a')
            topic_url = a['href']
            topic_headline = a.text.strip()
            
            #print(f'{topic_headline:<18}[{topic_url}]')
            text = text_align(topic_headline, 30)
            print(f'{text}[{topic_url}]')

        print()

def get_han_count(text):
    '''
Berechnen Sie die Länge der Zeichenfolge mit "2" für Zeichen voller Breite und "1" für Zeichen halber Breite.
    '''
    count = 0

    for char in text:
        if unicodedata.east_asian_width(char) in 'FWA':
            count += 2
        else:
            count += 1

    return count

def text_align(text, width, *, align=-1, fill_char=' '):
    '''
Text mit gemischter voller Breite / halber Breite
Füllen Sie die Lücken so aus, dass sie die angegebene Länge haben (Umrechnung der halben Breite).
    
    width:Geben Sie die Anzahl der Zeichen bei der Konvertierung mit halber Breite an
    align: -1 -> left, 1 -> right
    fill_char:Geben Sie das zu füllende Zeichen an

    return:Mit Leerzeichen gefüllter Text ('abcde     ')
    '''

    fill_count = width - get_han_count(text)
    if (fill_count <= 0): return text

    if align < 0:
        return text + fill_char*fill_count
    else:
        return fill_char*fill_count + text

if __name__ == '__main__':
    main()

Anfangs war das Format des Ausgabetextes wie folgt.

for item in ul_tag.find_all('li', class_='topicsListItem'):
    a = item.find('a')
    topic_url = a['href']
    topic_headline = a.text.strip()
            
    #Dieser Code verschiebt die URL-Spalte.
    print(f'{topic_headline:<18}[{topic_url}]')

In diesem Fall lautet die Ausgabe wie folgt. 2020-10-15_09h23_08.png

Spezifikationen wie print (f '{topic_headline: <18} [{topic_url}]') behandeln Zeichen voller und halber Breite ohne Unterschied.

Daher habe ich eine Funktion erstellt, um zwischen Text voller und halber Breite zu unterscheiden und das erforderliche Leerzeichen einzufügen.

def get_han_count(text):
    '''
Berechnen Sie die Länge der Zeichenfolge mit "2" für Zeichen voller Breite und "1" für Zeichen halber Breite.
    '''
    count = 0

    for char in text:
        if unicodedata.east_asian_width(char) in 'FWA':
            count += 2
        else:
            count += 1

    return count

def text_align(text, width, *, align=-1, fill_char=' '):
    '''
Text mit gemischter voller Breite / halber Breite
Füllen Sie die Lücken so aus, dass sie die angegebene Länge haben (Umrechnung der halben Breite).
    
    width:Geben Sie die Anzahl der Zeichen bei der Konvertierung mit halber Breite an
    align: -1 -> left, 1 -> right
    fill_char:Geben Sie das zu füllende Zeichen an

    return:Mit Leerzeichen gefüllter Text ('abcde     ')
    '''

    fill_count = width - get_han_count(text)
    if (fill_count <= 0): return text

    if align < 0:
        return text + fill_char*fill_count
    else:
        return fill_char*fill_count + text

Formatieren Sie es abschließend mit folgendem Code:

for item in ul_tag.find_all('li', class_='topicsListItem'):
    a = item.find('a')
    topic_url = a['href']
    topic_headline = a.text.strip()
            
    text = text_align(topic_headline, 30)
    print(f'{text}[{topic_url}]')

Dies löste das Problem. Derzeit hat text_align () die Option, ein Leerzeichen auf der linken Seite einzufügen, und es kann ein anderes Symbol als ein Leerzeichen angegeben werden.

Ausgabe in einen Texteditor usw.

Übrigens denke ich, dass die Ausgabe eines Python-Programms normalerweise eine Eingabeaufforderung ist, aber in diesem Fall möchten Sie sie möglicherweise in einen Texteditor oder ein Textverarbeitungsprogramm exportieren und speichern.

In einem solchen Fall können Sie die Software Paster verwenden, um direkt in die Übertragsposition einzufügen, z. B. einen Editor. 2020-10-15_09h50_53.png

Anschließend werden die Daten wie unten gezeigt direkt eingefügt. 2020-10-15_09h13_18.png

Am Ende

Diesmal war es ein Textformat-Thema, daher habe ich den Code zum Scraping nicht erklärt, aber fast alle find () -Methoden waren ausreichend.

Es steht Ihnen frei, den oben genannten Quellcode zu verwenden, dies geschieht jedoch auf eigenes Risiko.

Referenzseite

Für die Verwendung der Funktion, die zwischen voller Breite und halber Breite unterscheidet (unicodedata.east_asian_width ()), habe ich auf die folgende Site verwiesen.

Zählen Sie die Anzahl der Zeichen (Breite) als 1 Zeichen mit halber Breite und 2 Zeichen mit voller Breite in Python

Überprüfen Sie beim Durchführen von Web-Scraping unbedingt die robots.txt der Zielwebsite.

text:news.yahoo.co.jp/robots.txt


User-agent: *
Disallow: /comment/plugin/
Disallow: /comment/violation/
Disallow: /polls/widgets/
Disallow: /articles/*/comments
Sitemap: https://news.yahoo.co.jp/sitemaps.xml
Sitemap: https://news.yahoo.co.jp/sitemaps/article.xml
Sitemap: https://news.yahoo.co.jp/byline/sitemap.xml
Sitemap: https://news.yahoo.co.jp/polls/sitemap.xml

Recommended Posts

[Python] Eine Funktion, die die Breite ausrichtet, indem ein Leerzeichen in Text eingefügt wird, das eine Mischung aus voller und halber Breite ist
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
So setzen Sie in Python ein Leerzeichen mit halber Breite vor Buchstaben und Zahlen.
Die eval () -Funktion, die eine Zeichenfolge als Ausdruck in Python berechnet
Teilt die Zeichenfolge durch die angegebene Anzahl von Zeichen. In Ruby und Python.
Korrigieren Sie Schwankungen der Notation in halber und voller Breite in Python
[Python] Ändern Sie die Textfarbe und Hintergrundfarbe eines bestimmten Schlüsselworts in der Druckausgabe
Verarbeitung von CSV-Daten in voller und halber Breite in Python
Verschieben Sie die Alphabetzeichenfolge in Python um N Zeichen
Was bedeutet das letzte () in einer Funktion in Python?
Eine Bibliothek, die Leben und Tod anderer Maschinen durch Ping von Python aus überwacht
Ich habe auch versucht, die Funktionsmonade und die Zustandsmonade mit dem Generator in Python nachzuahmen
Finden Sie die scheinbare Breite einer Zeichenfolge in Python heraus
Eine Funktion, die iterable in Python in N Teile unterteilt
Ein Programm, das bestimmte Zeichen aus dem eingegebenen Text entfernt
Erstellen Sie den Code, der in Python "A und vorgeben B" ausgibt
So schreiben Sie eine Meta-Klasse, die sowohl Python2 als auch Python3 unterstützt
Code und Lehren für Funktionen, die spezielle Windows-Ordner in Python3-ctypes öffnen
[Python] Eine Funktion, die die gesamte Zeichenfolge mit einem regulären Ausdruck durchsucht und alle übereinstimmenden Zeichenfolgen abruft.
Erstellen Sie eine Funktion in Python
Zählen Sie die Anzahl der thailändischen und arabischen Zeichen in Python gut
Verwenden Sie die Unicodedata-Bibliothek von Python, um Zeichen in voller und halber Breite anzuzeigen
Lesen Sie die Standardausgabe eines Unterprozesses zeilenweise in Python