from urllib.request import urlopen
from bs4 import BeautifulSoup
from pprint import pprint
URL = 'http://news.yahoo.co.jp/'
with urlopen(URL) as res:
html = res.read().decode("utf-8")
soup = BeautifulSoup(html, 'html.parser')
titles = soup.select('.ttl a') #Obtenez dom
titles = [t.contents[0] for t in titles] #Obtenir du texte
pprint(titles)
Résultat de sortie
>>>
['M. Trump "Judiciaire trop"',
'Rapport quotidien PKO Inspection spéciale de la défense instruite',
'Erreur d'administration à l'hôpital Arrêt cardio-pulmonaire temporaire',
'200 élèves du premier cycle du secondaire en vêtements spéciaux Fukuoka',
'Le parti au pouvoir néerlandais conservera le premier parti',
'Rare avec une probabilité de 1/320 000 à WBC',
'Le bureau passionné de Nakai sans nier',
'La légende la plus forte de Watase et l'existence d'un frère aîné']
Méthode de sélection des éléments de BeautifulSoup4 Il y a aussi «find» et «find_all», mais «select» est souvent utilisé.
Si aucun n'est renvoyé lors de la récupération du texte
Essayez .string
, .text
, .contents [0]
etc.
http://stackoverflow.com/questions/20750852/beautifulsoup-4-python-string-returns-none
from urllib.request import urlopen
from bs4 import BeautifulSoup
from pprint import pprint
import csv
import re
tenki = []
URL = "http://weather.livedoor.com/forecast/rss/area/130010.xml"
with urlopen(URL) as res:
html = res.read().decode("utf-8")
soup = BeautifulSoup(html, "html.parser")
for item in soup.find_all("item"):
title = item.find("title").string
if title.find("[ PR ]") == -1: #Le ramassage des poubelles
text = re.sub(r'\[?.+\]\s', '', title) # []Supprimer à l'intérieur
result = text.split(' - ')
tenki.append(result)
pprint(tenki)
Résultat de sortie
>>>
[['Tokyo', 'Nuageux', 'Température maximale ℃', '23 juillet(journée)'],
['Tokyo', 'Nuageux', 'Température maximale 32 ℃', '24 juillet(Mois)'],
['Tokyo', 'Nuageux', 'Température maximale 34 ℃', '25 juillet(Feu)'],
['Tokyo', 'Nuageux et parfois ensoleillé', 'Température maximale 33 ℃', '26 juillet(eau)'],
['Tokyo', 'Nuageux et parfois ensoleillé', 'Température maximale 31 ℃', '27 juillet(bois)'],
['Tokyo', 'Nuageux et parfois ensoleillé', 'Température maximale 32 ℃', '28 juillet(Argent)'],
['Tokyo', 'Nuageux et parfois ensoleillé', 'Température maximale 32 ℃', '29 juillet(sol)'],
['Tokyo', 'Nuageux et parfois ensoleillé', 'Température maximale 32 ℃', '30 juillet(journée)']]
Faites-en html.parser de base lxml.parser semble avoir des erreurs occasionnelles https://www.crummy.com/software/BeautifulSoup/bs4/doc/
with open('weather.csv','w',newline='') as f:
writer = csv.writer(f)
writer.writerow(['city','status','max','date'])
writer.writerows(tenki)
weather.csv
place,status,max,date
Tokyo,Nuageux,Température maximale ℃,23 juillet(journée)
Tokyo,Nuageux,Température maximale 32 ℃,24 juillet(Mois)
Tokyo,Nuageux,Température maximale 34 ℃,25 juillet(Feu)
Tokyo,Nuageux et parfois ensoleillé,Température maximale 33 ℃,26 juillet(eau)
Tokyo,Nuageux et parfois ensoleillé,Température maximale 31 ℃,27 juillet(bois)
Tokyo,Nuageux et parfois ensoleillé,Température maximale 32 ℃,28 juillet(Argent)
Tokyo,Nuageux et parfois ensoleillé,Température maximale 32 ℃,29 juillet(sol)
Tokyo,Nuageux et parfois ensoleillé,Température maximale 32 ℃,30 juillet(journée)
CSV->JSON
rows = []
csvfile = open('weather.csv', 'r')
jsonfile = open('weather.json', 'w')
fieldnames = ('city','status','max','date')
reader = csv.DictReader(csvfile, fieldnames)
for index,row in enumerate(reader):
if(index == 0): continue # {"city": "city" ...}Est inutile
rows.append(row)
json.dump(rows, jsonfile, ensure_ascii=False, indent=2)
weather.json
[
{
"date": "7\u670823\u65e5(\u65e5)",
"status": "\u66c7\u308a",
"city": "\u6771\u4eac",
"max": "\u6700\u9ad8\u6c17\u6e29\u2103"
},
{
"date": "7\u670824\u65e5(\u6708)",
"status": "\u66c7\u308a",
"city": "\u6771\u4eac",
"max": "\u6700\u9ad8\u6c17\u6e2932\u2103"
},
...
]
# ics.Grattage des médias
import os
from urllib.request import urlopen
from bs4 import BeautifulSoup
URL = "https://ics.media/"
with urlopen(URL) as res:
html = res.read().decode("utf-8")
soup = BeautifulSoup(html, "html.parser")
#Obtenez des images (et des titres) de nouveaux articles
topics = soup.select(".topicsContainer")[0].nextSibling
topics_urls = topics.select(".thumb img")
topics_ttls = topics.select(".entryTitle a")
img_urls = [e["src"] for e in topics_urls]
img_ttls = [e.string for e in topics_ttls]
"""
#S'il s'agit d'un chemin relatif, convertissez-le en chemin absolu
#Notation d'inclusion de liste, opérateur ternaire
img_urls = [u if u.find("http") == 0 else URL + u for u in img_urls]
"""
#sauvegarder
img_dir = "images"
if not os.path.exists(img_dir):
os.mkdir(img_dir)
for i,url in enumerate(img_urls):
print("article"+str(1+i), img_ttls[i])
print(url)
with urlopen(url) as res:
img = res.read()
with open(img_dir + "/entry_image%d.png " % (i+1), "wb") as f:
f.write(img)
Résultat de sortie
>>>
Article 1 Connaissance de base de la conception CSS que les créateurs Web doivent connaître
https://ics.media/wp-content/uploads/2017/03/170315_eyecatch-640x256.jpg
Article 2 Exprimé uniquement avec CSS3! J'ai fait une micro interaction qui peut être utilisée avec copie
https://ics.media/wp-content/uploads/2017/03/main-640x256.png
Article 3 La qualité des sites Web publicitaires est incroyable!5 sites nationaux qui sont devenus un sujet brûlant récemment
https://ics.media/wp-content/uploads/2017/03/170227_web_trend_1611_1702_eye-640x256.jpg
... (Omis) ...
Obtenez des éléments frères et sœurs http://tdoc.info/beautifulsoup/
module os https://docs.python.jp/3/library/os.html
énumération, fonction Boucle avec index http://python.civic-apps.com/zip-enumerate/
chrome dev tool Settings > Preferences > Debugger > Disable JavaScript
Si vous désactivez JS et rechargez et que l'élément disparaît, Sites où le DOM est généré dynamiquement par JS
Cette fois, j'utiliserai PhantomJS et Selenium
$ brew install phantomjs
$ pip3 install —upgrade selenium
from selenium import webdriver
from bs4 import BeautifulSoup
from pprint import pprint
URL = "https://dokusho-ojikan.jp/original/#!top"
driver = webdriver.PhantomJS()
driver.get(URL)
html = driver.page_source
bs = BeautifulSoup(html, "html.parser")
img_urls = [img.get("src") for img in bs.select("#unique-pickup img")]
for u in img_urls:
print(u)
Résultat de sortie
>>>
https://cdn.om.dokusho-ojikan.jp/img/1f387c10-a8f8-11e6-8a10-525431b7cd60.jpg
https://cdn.om.dokusho-ojikan.jp/img/98c2e066-9a44-11e5-9ae2-52540e2de543.png
https://cdn.om.dokusho-ojikan.jp/img/7adbba1b-344b-11e5-be53-5254f877f35f.jpg
... (Omis) ...
Recommended Posts