[PYTHON] (Mémo) Jusqu'à ce que vous extrayiez uniquement la partie que vous voulez d'une certaine page Web, convertissez-la en page Sphinx et imprimez-la au format PDF

Pour cette raison, je voulais documenter les exercices de marche saine sur cette page. J'étudiais ** Sphinx ** à titre d'essai, je vais donc l'utiliser. J'ai l'impression que je l'utilise de force, donc cela a peut-être été extrêmement inefficace, mais c'est bien parce que c'était relativement bien fait.

Livrables (exercices sains)

Les pages vierges sont mélangées au milieu, mais ça va.

Ce que j'ai utilisé

Sphinx

http://sphinx-users.jp/

BeautifulSoup

http://tdoc.info/beautifulsoup/

Il semble y avoir ** HTMLParser **, mais je ne savais pas comment l'utiliser, et c'était facile pour moi de comprendre personnellement, alors je l'ai utilisé.

pip install BeautifulSoup

Après cela, utilisez ceci pour extraire l'image et le texte d'explication du HTML de la page en question et utilisez Sphinx pour le remodeler en un document. Plus à ce sujet plus tard.

Revenir à la page Sphinx

Pensons au flux général

Tout d'abord, l'URL de la page de gymnastique est

http://kaigoouen.net/program/gymnastics/gymnastics_{Numéro de type de gymnastique}_{numéro de page}.html

Avec ce sentiment, il y a deux endroits où les nombres sont entrés (je m'en fiche, mais ce site fait-il du HTML pour chaque page?).

Numéro de type de gymnastique

Il y a trois niveaux d'exercices de marche sains: hop, step et jump, mais il semble que ** hop a 2, step a 3, et jump a 4 ** (Au fait, 1 semble être comme la théorie précédente, donc cette fois Est inutile).

numéro de page

Puisque chacun des exercices de sauts, pas et sauts se compose de plusieurs pages, ** le nombre de pages est entré ici **.

Si vous pensez en fonction de ceux-ci, est-ce un flux comme celui-ci?

  1. Sélectionnez le type de gymnastique
  2. Sélectionnez une page dans la gymnastique sélectionnée
  3. Extrayez la partie souhaitée du HTML de la page sélectionnée
  4. Aller à la page suivante et revenir à 2 (répéter jusqu'à la dernière page)

Je prévois de fabriquer les matériaux pour le houblon, les étapes et les sauts individuellement, donc c'est généralement OK.

Pensons au flux détaillé

Dans le flux considéré ci-dessus, considérez la partie 3.

Apparemment, la partie que je veux est dans l'élément div ** de la classe ** box02.

Par exemple, le houblon ressemble à ceci.

<div class="box02">
    <h2>
        <img alt="nom de l'article" src="text.gif"></img>
    </h2>
    <div class="box02_txt_hop">
        <div class="hop_box">
            <div class="hop_txt">Commentaire</div>
            <div class="hop_image">
                <img alt="Photo de référence" src="image.jpg "></img>
            </div>
        </div>
        <div class="hop_box">
            <!--Suite de l'article-->
        </div>
</div>
<div class="box02">
    <!--Prochain point-->
</div>

Donc, ce que je veux, c'est ...

c'est tout. Utilisez le module BeautifulSoup pour affiner ces derniers. Ce n'était pas trop difficile car vous pouvez ** trouver ** ou ** trouver tout ** avec des noms d'éléments ou des noms de classes. Après cela, écrivez un script Python qui réécrit le format réduit au format .rst pour Sphinx. Faites de votre mieux en regardant le Document.

Pour le moment, j'ai utilisé le ** nom de l'élément comme titre **, et ** je voulais organiser le commentaire et les images côte à côte, j'ai donc utilisé la méthode du tableau **.

Un petit problème

Le HTML de la page d'origine était bizarre

Lors de l'extraction des explications et des images de chaque élément, j'ai d'abord pensé à ** traçons la partie pertinente du haut par nom de classe **. Donc, quand j'ai examiné les éléments de ** Firefox avec **, il m'a semblé que je devrais creuser dedans comme ** box02> box02_txt_hop> hop_box> hop_image ou hop_txt **, donc je le faisais. Ensuite, le dernier commentaire pour chaque élément sera omis. Donc, quand j'ai regardé de près, il m'a semblé que pour une raison quelconque, seule l'explication à la fin de chaque élément n'était pas incluse dans la classe ** hop_box pour le texte et l'image, et c'était directement sous la boîte supérieure02_txt_hop ** (raison). Est inconnu). Ainsi, hop_box est décidé à ignorer depuis le début. En premier lieu, find and findAll de BeautifulSoup semblent ** rechercher parmi tous les éléments sous l'élément cible en fonction des conditions **, il semble donc qu'il n'était pas nécessaire de rechercher une couche à la fois.

La table devient automatiquement rayée

Si le contenu n'était que du texte, ce serait plus beau, mais personnellement je ne l'aimais pas car il était difficile de voir s'il incluait des images. Cependant, je ne savais pas comment changer le style (PDF en dehors du HTML), donc je l'ai traité en créant un nouveau tableau un par un.

UnicodeDecodeError et UnicodeEncodeError

Fréquemment utilisé lors de la sortie de fichiers .rst à partir de scripts Python.

type(text)

Je vais le réparer régulièrement tout en le vérifiant.

Jusqu'à l'impression au format PDF

Il semble y avoir deux façons, ** rst2pdf ** et ** latex **, mais la première me semblait plus facile, j'ai donc décidé d'utiliser ** rst2pdf cette fois **.

Et j'en ai été accro les uns après les autres (peut-être que je ne voulais pas l'installer avec pip).

J'obtiens une erreur avec make pdf```

ImportError: reportlab requires Python 2.7+ or 3.3+; 3.0-3.2 are not supported.

Ensuite, reportez-vous à ici

pip install -U reportlab==2.5



 Ensuite, l'erreur change.

>[ERROR] pdfbuilder.py:130 need more than 3 values to unpack
Traceback (most recent call last):
  File "/home/vagrant/www/public/hopstepjump/venv/lib/python2.6/site-packages/rst2pdf/pdfbuilder.py", line 78, in write
    docname, targetname, title, author = entry[:4]
ValueError: need more than 3 values to unpack
FAILED
build succeeded, 1048 warnings.

 En bref, la façon d'écrire ** conf.py ** était différente. Au début, je mets les documents que je souhaite faire en pdf dans ** pdf_documents **

```py
('hop','step','jump'),

Je pensais que ce serait connecté comme ça, mais c'était différent,

('docName', u'nom de fichier', u'Titre qui vient à la couverture du PDF', u'Auteur'),

Il semble que (en fait, c'était écrit dans le manuel). Cette taple est incluse dans la liste, donc si vous souhaitez convertir plusieurs documents en PDF, vous pouvez ajouter plusieurs taples.

Quoi qu'il en soit, jetez un second coup d'œil et `` créez un pdf ''

IOError: decoder jpeg not available identity=[ImageReader@0x3a3ce10 filename='/home/vagrant/www/public/hopstepjump/venv/lib/python2.6/site-packages/rst2pdf/images/image-missing.jpg'] FAILED build succeeded.

Un autre nouveau problème. Le jpeg est-il inutile?

Après enquête, il semble que libjpeg soit nécessaire, pas que PIL soit mauvais. http://kwmt27.net/index.php/2013/07/14/python-pil-error-decoder-jpeg-not-available/

Installez-le et réinstallez PIL Pouvez-vous aller avec miam?

yum search libjpeg

============================= N/S Matched: libjpeg ============================= libjpeg-turbo-devel.i686 : Headers for the libjpeg-turbo library libjpeg-turbo-devel.x86_64 : Headers for the libjpeg-turbo library libjpeg-turbo-static.x86_64 : Static version of the libjpeg-turbo library libjpeg-turbo.x86_64 : A MMX/SSE2 accelerated library for manipulating JPEG : image files libjpeg-turbo.i686 : A MMX/SSE2 accelerated library for manipulating JPEG image : files

Je ne sais pas lequel, alors essayez `` yum install libjpeg '' (j'espère que vous choisirez le meilleur pour vous).

Updated: libjpeg-turbo.x86_64 >0:1.2.1-3.el6_5

Complete!

Il semble que cela ait été fait, alors suivez la page à laquelle je fais référence

pip install -i pillow

make pdf

IOError: decoder jpeg not available identity=[ImageReader@0x221e150 filename='/home/vagrant/www/public/hopstepjump/venv/lib/python2.6/site-packages/rst2pdf/images/image-missing.jpg'] FAILED build succeeded.

Pas de progrès ... yum list | grep libjpegQuand je l'ai essayé, il a été installé correctement, mais l'oreiller et le pilier sont les mêmes, n'est-ce pas?

Alors

pip install pil

Mais ça ne change pas ...

C'est ça? http://all-rounder-biz.blogspot.jp/2013/06/macioerror-decoder-jpeg-not-available.html Faux·····.

Ensuite ceci? http://d.hatena.ne.jp/rougeref/20130116 Oui, j'ai été déçu ...

Eh bien, si vous regardez l'écran après avoir installé PIL


*** TKINTER support not available
*** JPEG support not available
--- ZLIB (PNG/ZIP) support available
*** FREETYPE2 support not available
*** LITTLECMS support not available
--------------------------------------------------------------------

Il est devenu. Certes, JPEG n'est pas disponible. Le message d'erreur ne ment pas.

C'est ici? http://dev-pao.blogspot.jp/2010/04/python-imaging-library-piljpeg.html Non ...

Suivant http://d.hatena.ne.jp/rougeref/20130116

Oh, peut-être ...

yum install libjpeg-devel

Ensuite, effacez le PIL et réinstallez.

--- JPEG support available

Il semble que c'était parce que ** devel n'a pas pu être installé **. Quoi qu'il en soit, le problème JPEG est résolu, donc `` make pdf ''.

[ERROR] image.py:110 Missing image file: /home/vagrant/www/public/hopstepjump/http://kaigoouen.net/img/hop_pic_108.jpg \u304b\u304b\u3068\u304b\u3089\u3064\u3044\u3066\u30fb\u30fb\u30fb\u3064\u307e\u5148\u3067\u3051\u308a\u51fa\u3059\u3001\u3092\u7e70\u308a\u8fd4\u3057\u306a\u304c\u3089\u3001\u6b69\u304d\u307e\u3057\u3087\u3046\u3002 line done build succeeded.

D'accord, cela ne fonctionne pas, mais ** l'endroit où j'essaie de charger l'image est évidemment étrange **. Mais je ne sais pas comment y remédier. N'est-il pas censé récupérer des images de l'extérieur?

Il était difficile de le vérifier comme message d'erreur, j'ai donc essayé diverses expériences et j'ai trouvé qu'il était replace dans **. Rst. ) Semblait bien **. Est-ce une sorte de bug? Quoi qu'il en soit, la solution est de ne pas l'utiliser.

Ensuite, les caractères sont déformés.

Ce qui est suspect est

sh: fc-match: commande introuvable [ERROR] findfonts.py:208 Unknown font: DejaVu Sans Mono-Bold

Partie (complète). Qu'est-ce que ** fc-match **? Donc, quand je l'ai googlé, cela ressemble à une commande qui vient dans une bibliothèque appelée ** fontconfig **.

Puis avec miam

yum search fontconfig

=========================== N/S Matched: fontconfig ============================ fontconfig.i686 : Font configuration and customization library fontconfig.x86_64 : Font configuration and customization library fontconfig-devel.i686 : Font configuration and customization library fontconfig-devel.x86_64 : Font configuration and customization library

Il y a aussi ordinaire et se développer. Je ne marcherai pas deux fois sur la même ornière ... alors j'ai installé develop. Et quand j'ai réessayé `` make pdf '', la précédente "commande introuvable" a été résolue. Cependant, la ligne ci-dessous n'est pas résolue. En premier lieu, il y a «DejaVu Sans Mono-Bold», mais je ne connais pas une telle police, qu'est-ce que c'est?

http://www.fontsquirrel.com/fonts/dejavu-sans-mono

Oh, c'est une police pour l'anglais par tous les moyens. Cela signifie-t-il que vous ne pouvez pas lire la feuille de style? ** conf.py ** ne semble pas être faux, alors consultez ** ja.json **, qui est la feuille de style. Je pense que je l'ai écrit d'après le document. Ensuite, après m'être inquiété de plusieurs heures, je n'ai pas fermé le devis à un seul endroit. J'ai aussi appris que les simples ne sont pas bons et qu'ils doivent être doubles.

Quoi qu'il en soit, il a finalement commencé à rechercher la police japonaise définie ... mais ** je ne peux pas la trouver **. En premier lieu, la commande ** fc-list n'a rien retourné **.

Eh bien, lorsque j'ai déplacé le fichier de police sous / usr / share / fonts, il a été résolu et les caractères déformés ont été corrigés, mais je ne comprends pas la signification de pdf_font_path ** dans ** conf.py. Actuellement, le contenu est vide, mais il peut être affiché en japonais sans aucun problème, et même si j'essaye d'écrire le chemin d'un autre endroit, il n'est pas reflété. Et si je veux le mettre ailleurs? (Réécrire les paramètres de ** Fontconfig ** quelque part?)

C'est devenu un script Python comme celui-ci

hopstepjump.py


#! /usr/bin/env python
# *-*coding:utf-8*-*
import sys,re,urllib2

from BeautifulSoup import BeautifulSoup


#### reference page ####
base_url = 'http://kaigoouen.net'

hopstepjump = {
	'hop':{
		'index':2,
		'last_page':25,
	},
	'step':{
		'index':3,
		'last_page':39,
	},
	'jump':{
		'index':4,
		'last_page':46,
	},
}


#### for make .rst files ####
br = u'\n'

page_break = u".. raw:: pdf%s   PageBreak" % (br*2)

def soup_to_sphinx(pg):

	p = 1

	while p <= pg['last_page']:

		url = base_url + '/program/gymnastics/gymnastics_{index}_{page}.html'.format(index=pg['index'],page=p)

		htmldata = urllib2.urlopen(url)

		soup = BeautifulSoup( unicode(htmldata.read(),'utf-8') )

		for box in soup.findAll('div',{'class':'box02'}):

			lessons = box.find('div',{'class':'box02_txt_%s' % choice})

			if lessons is not None:

				title = box.contents[1].contents[0]['alt']
				print( sphinx_head(title) )

				images = lessons.findAll('div',{'class':'%s_image' % choice})

				texts = lessons.findAll('div',{'class':'%s_txt' % choice})
				texts = iter(texts)

				for image in images:
					src = base_url + image.contents[0]['src']
					image = sphinx_image(src)

					text = texts.next().renderContents()
					text = sphinx_text(text)

					print( sphinx_listtable(image,text) )

				print(page_break)				

		htmldata.close()
		p += 1
	

def sphinx_head(txt):
	return br.join([br,txt,u"="*30+br]).encode('utf-8')


def sphinx_listtable(s_img,s_txt):
	table = u".. list-table::" + br
	image = u"   * - %s" % s_img
	text = u"     - | %s" % s_txt

	return br.join([table,image,text,br]).encode('utf-8')


def sphinx_image(src):
	option = u":width: 150pt"
	return u".. image:: %s" % src + br + u"          %s" % option


def sphinx_text(txt):
	text = txt.decode('utf-8').replace(u"<br />",br)
	if br in text:
		texts = text.splitlines()
		text = reduce(lambda x,y: x +  br + u"       | " + y,texts)
	return text



if __name__ == '__main__':

	try:
		choice = sys.argv[1]
		page = hopstepjump[choice]
	except IndexError:
		print("[Erreur]: Option requise ('hop'Ou'step'Ou'jump'のいずれOu)。")
		exit("    -Exemple:'python %s hop'" % sys.argv[0])
	except KeyError:
		print("[Erreur]: Les options sont différentes ('hop'Ou'step'Ou'jump'のいずれOu)。")
		exit("    -Exemple:'python %s hop'" % sys.argv[0])

	soup_to_sphinx(page)

Comment utiliser

python hopstepjump.py hop > hop.rst

C'est un plaisir d'écrire un fichier de plus de 1000 lignes avec une seule commande. Quoi qu'il en soit, si vous faites une configuration avec cela, tout ce que vous avez à faire est make html` ou `` make pdf```.

GitHub

https://github.com/juniskw/hopstepjump/tree/no_replace_listtable

A propos, un étranger que je ne connais pas est autorisé, est-ce quelque chose de malicieux?

Recommended Posts

(Mémo) Jusqu'à ce que vous extrayiez uniquement la partie que vous voulez d'une certaine page Web, convertissez-la en page Sphinx et imprimez-la au format PDF
Utilisez PIL en Python pour extraire uniquement les données souhaitées d'Exif
Je veux découper uniquement le visage d'une image de personne avec Python et l'enregistrer ~ Détection de visage et rognage avec face_recognition ~
Récupérer une image d'une page Web et la redimensionner
Lorsque vous souhaitez que le thème de votre documentation Sphinx soit le même
Exportez le rapport au format PDF à partir de DB avec Python et attachez-le automatiquement à un e-mail et envoyez-le
Je souhaite envoyer un signal uniquement du sous-thread au thread principal
[Mémo personnel] Obtenez des données sur le Web et faites-en un DataFrame
Le magasin d'infrastructure a décidé de développer des «outils Web» comme thème. .. Jusqu'à ce que vous pensiez à l'environnement pour créer des "outils Web".
Utilisez Pillow pour rendre l'image transparente et en superposer une partie seulement
Extraire des données d'une page Web avec Python
[Python3] Prenez une capture d'écran d'une page Web sur le serveur et recadrez-la davantage
Extraire des images et des tableaux de pdf avec python pour réduire la charge de reporting