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.
Der endgültige Text lautet wie folgt.
Verwenden Sie Python 3.7. Die Entwicklungsumgebung ist Visual Studio Community 2019.
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.
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.
Ü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.
Anschließend werden die Daten wie unten gezeigt direkt eingefügt.
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.
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.
Ü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