[PYTHON] (Memo) Bis Sie nur den gewünschten Teil von einer bestimmten Webseite extrahieren, konvertieren Sie ihn in eine Sphinx-Seite und drucken Sie ihn als PDF

Aus diesem Grund wollte ich die Übungen für gesundes Gehen auf dieser Seite dokumentieren. Ich habe ** Sphinx ** als Test studiert, also werde ich dies verwenden. Ich habe das Gefühl, dass ich es gewaltsam benutze, daher war es vielleicht äußerst ineffizient, aber es ist gut, weil es relativ gut gemacht wurde.

Ergebnisse (gesunde Übungen)

Leere Seiten werden in der Mitte gemischt, aber es ist okay.

Was ich benutzt habe

Sphinx

http://sphinx-users.jp/

BeautifulSoup

http://tdoc.info/beautifulsoup/

Es scheint etwas zu geben, das ** HTMLParser ** heißt, aber ich wusste nicht, wie ich es verwenden sollte, und es war für mich persönlich leicht zu verstehen, also habe ich es verwendet.

pip install BeautifulSoup

Verwenden Sie diese Option anschließend, um das Erklärungsbild und den Erklärungstext aus dem HTML-Code der betreffenden Seite zu extrahieren, und verwenden Sie Sphinx, um es in ein Dokument umzuformen. Dazu später mehr.

Zur Sphinx-Seite zurückkehren

Lassen Sie uns über den allgemeinen Fluss nachdenken

Zunächst lautet die URL der Turnseite

http://kaigoouen.net/program/gymnastics/gymnastics_{Turnnummer}_{Seitennummer}.html

Mit diesem Gefühl gibt es zwei Stellen, an denen Zahlen eingegeben werden (es ist mir egal, aber macht diese Site HTML für jede Seite?).

Turnnummer

Es gibt drei Stufen gesunder Gehübungen: Hüpfen, Schritt und Springen, aber es scheint, dass ** Hopfen 2 hat, Schritt 3 hat und Springen 4 ** (Übrigens scheint 1 wie die vorherige Theorie zu sein, also diesmal Ist unnötig).

Seitennummer

Da jede der Sprung-, Schritt- und Sprungübungen aus mehreren Seiten besteht, ** wird hier die Anzahl der Seiten eingegeben **.

Wenn Sie denken, basierend auf diesen, ist es ein Fluss wie dieser?

  1. Wählen Sie die Art der Gymnastik
  2. Wählen Sie eine Seite aus der ausgewählten Gymnastik
  3. Extrahieren Sie den gewünschten Teil aus dem HTML-Code der ausgewählten Seite
  4. Gehen Sie zur nächsten Seite und kehren Sie zu 2 zurück (wiederholen Sie bis zur letzten Seite).

Ich habe vor, die Materialien für Hopfen, Schritte und Sprünge einzeln herzustellen, daher ist dies im Allgemeinen in Ordnung.

Lassen Sie uns über den detaillierten Ablauf nachdenken

Betrachten Sie in dem oben betrachteten Ablauf Teil 3.

Anscheinend ist der Teil, den ich will, im div-Element ** der Klasse ** box02.

Zum Beispiel sehen Hopfen so aus.

<div class="box02">
    <h2>
        <img alt="Artikelname" src="text.gif"></img>
    </h2>
    <div class="box02_txt_hop">
        <div class="hop_box">
            <div class="hop_txt">Kommentar</div>
            <div class="hop_image">
                <img alt="Referenzfoto" src="image.jpg "></img>
            </div>
        </div>
        <div class="hop_box">
            <!--Artikel Fortsetzung-->
        </div>
</div>
<div class="box02">
    <!--Nächstes Objekt-->
</div>

Also, was ich dabei will, ist ...

das ist alles. Verwenden Sie das BeautifulSoup-Modul, um diese einzugrenzen. Es war nicht allzu schwierig, weil Sie ** finden ** oder ** findAll ** mit Element- oder Klassennamen finden können. Schreiben Sie danach ein Python-Skript, das das eingegrenzte Skript in das erste Format für Sphinx umschreibt. Geben Sie einfach Ihr Bestes, während Sie sich das [Dokument] ansehen (http://sphinx-users.jp/).

Vorläufig wurde der Artikelname auf die Überschrift ** gesetzt, und die Erklärung und das Bild wurden nebeneinander angeordnet, sodass die Tabellenmethode verwendet wurde.

Ein bisschen Ärger

Der HTML-Code der Originalseite war komisch

Beim Extrahieren der Erklärung und des Bildes jedes Elements dachte ich zuerst an ** Lassen Sie uns den relevanten Teil von oben nach Klassennamen verfolgen **. Als ich die Elemente von ** Firefox mit ** untersuchte, schien es mir, dass ich mich wie ** box02> box02_txt_hop> hop_box> hop_image oder hop_txt ** damit beschäftigen sollte, also tat ich es. Dann wird der letzte Kommentar für jedes Element weggelassen. Bei genauerem Hinsehen schien es also, dass aus irgendeinem Grund nur die Erklärung am Ende jedes Elements nicht in der ** hop_box-Klasse sowohl für den Text als auch für das Bild enthalten war und sich direkt unter der oberen box02_txt_hop ** (Grund) befand. Ist unbekannt). Daher wird hop_box von Anfang an ignoriert. Erstens scheinen die find and findAll von BeautifulSoup ** von allen Elementen unterhalb des Zielelements gemäß den Bedingungen ** zu suchen, so dass es anscheinend nicht erforderlich war, jeweils eine Ebene zu durchsuchen.

Der Tisch wird automatisch gestreift

Wenn der Inhalt nur Text wäre, wäre er schöner, aber ich persönlich mochte ihn nicht, weil es schwer zu erkennen war, ob er Bilder enthielt. Ich wusste jedoch nicht, wie ich den Stil ändern sollte (PDF außer HTML), also habe ich mich darum gekümmert, indem ich nacheinander eine neue Tabelle erstellt habe.

UnicodeDecodeError und UnicodeEncodeError

Wird häufig bei der Ausgabe von .rst-Dateien aus Python-Skripten verwendet.

type(text)

Ich werde es stetig reparieren, während ich es überprüfe.

Bis zum Drucken als PDF

Es scheint zwei Möglichkeiten zu geben, ** rst2pdf ** und ** latex **, aber die erstere schien einfacher zu sein, also habe ich mich dieses Mal für ** rst2pdf ** entschieden.

Und ich war nacheinander süchtig danach (vielleicht wollte ich es nicht mit pip installieren).

Ich erhalte eine Fehlermeldung mit `` `make pdf```

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

Dann beziehen Sie sich auf hier

pip install -U reportlab==2.5



 Dann ändert sich der Fehler.

>[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.

 Kurz gesagt, die Art und Weise, ** conf.py ** zu schreiben, war anders. Zuerst habe ich die Dokumente, die ich erstellen möchte, in ** pdf_documents ** in pdf eingefügt

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

Ich dachte, dass es so verbunden sein würde, aber es war anders,

('docName', u'Dateiname', u'Titel, der auf das Cover von PDF kommt', u'Autor'),

Es scheint, dass (in der Tat wurde es im Handbuch geschrieben). Dieses Taple ist in der Liste enthalten. Wenn Sie also mehrere Dokumente in PDF konvertieren möchten, können Sie mehrere Taples hinzufügen.

Wie auch immer, werfen Sie einen zweiten Blick und machen Sie "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.

Ein weiteres neues Problem. Ist JPEG nutzlos?

Als ich es nachgeschlagen habe, scheint es, dass libjpeg notwendig ist, nicht dass PIL schlecht ist. http://kwmt27.net/index.php/2013/07/14/python-pil-error-decoder-jpeg-not-available/

Installieren Sie dies und installieren Sie PIL neu Kannst du mit lecker gehen?

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

Ich weiß nicht, welches, also versuche `` `yum install libjpeg``` (ich hoffe, dass du das beste für dich auswählst).

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

Complete!

Es scheint, dass es getan wurde, also folgen Sie der Seite, auf die ich verwiesen habe

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.

Keine Fortschritte ... yum list | grep libjpegAls ich es ausprobierte, wurde es richtig installiert, aber Kissen und Pil sind gleich, nicht wahr?

Damit

pip install pil

Aber es ändert sich nicht ...

Ist das das? http://all-rounder-biz.blogspot.jp/2013/06/macioerror-decoder-jpeg-not-available.html Falsch·····.

Dann das? http://d.hatena.ne.jp/rougeref/20130116 Ja, ich war enttäuscht ...

Nun, wenn Sie nach der Installation von PIL auf das Display schauen


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

Es ist geworden. Natürlich bleibt JPEG nicht verfügbar. Die Fehlermeldung lügt nicht.

Ist es hier? http://dev-pao.blogspot.jp/2010/04/python-imaging-library-piljpeg.html Nein ...

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

Oh, vielleicht ...

yum install libjpeg-devel

Löschen Sie dann die PIL und installieren Sie sie erneut.

--- JPEG support available

Es scheint, dass es daran lag, dass ** devel nicht installiert werden konnte **. Wie auch immer, das JPEG-Problem ist gelöst, also `` `PDF erstellen```.

[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.

Okay, es funktioniert nicht, aber ** der Ort, an dem ich versuche, das Bild zu laden, ist offensichtlich seltsam **. Aber ich weiß nicht, wie ich das beheben soll. Soll es nicht Bilder von außen holen?

Es war schwierig, es als Fehlermeldung zu überprüfen, daher habe ich verschiedene Experimente versucht und festgestellt, dass es in **. Rst Ersetzen war. ) Schien in Ordnung zu sein **. Ist es eine Art Fehler? Wie auch immer, die Lösung besteht darin, es nicht zu verwenden.

Als nächstes werden die Charaktere verstümmelt.

Was verdächtig ist, ist

sh: fc-match: Befehl nicht gefunden [ERROR] findfonts.py:208 Unknown font: DejaVu Sans Mono-Bold

Teil (voll aus). Was ist ** fc-match **? Wenn ich es gegoogelt habe, sieht es aus wie ein Befehl, der in einer Bibliothek namens ** fontconfig ** enthalten ist.

Dann mit lecker

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

Es gibt auch gewöhnliche und sich entwickelnde. Ich werde nicht zweimal auf die gleiche Brunft treten ... also habe ich Develop installiert. Und als ich erneut versuchte, "PDF erstellen" zu machen, wurde der vorherige "Befehl nicht gefunden" behoben. Die folgende Zeile ist jedoch ungelöst. Erstens gibt es "DejaVu Sans Mono-Bold", aber ich kenne eine solche Schriftart nicht. Was ist das?

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

Oh, es ist auf jeden Fall eine Schrift für Englisch. Bedeutet das, dass Sie das Stylesheet nicht lesen können? ** conf.py ** schien nicht falsch zu sein, also schau dir ** ja.json ** an, das ist das Stylesheet. Ich glaube, ich habe es gemäß dem Dokument geschrieben. Das Ergebnis der Sorge um mehrere Stunden war, dass ich das Angebot nicht nur an einer Stelle geschlossen habe. Ich habe auch gelernt, dass Singles nicht gut sind und dass sie Doppel sein müssen.

Wie auch immer, es fing endlich an, nach der eingestellten japanischen Schriftart zu suchen ... aber ** ich kann sie nicht finden **. Erstens hat der Befehl ** fc-list nichts zurückgegeben **.

Nun, als ich die Schriftartdatei unter / usr / share / fonts verschoben habe, wurde sie gelöst und die verstümmelten Zeichen wurden behoben, aber dann verstehe ich die Bedeutung von pdf_font_path ** in ** conf.py nicht. Derzeit ist der Inhalt leer, aber er kann problemlos auf Japanisch angezeigt werden, und selbst wenn ich versuche, den Pfad eines anderen Ortes zu schreiben, wird er nicht wiedergegeben. Was ist, wenn ich es woanders hinstellen möchte? (Irgendwo die Einstellungen von ** Fontconfig ** umschreiben?)

Es wurde ein Python-Skript wie dieses

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("[Error]: Option erforderlich ('hop'Oder'step'Oder'jump'のいずれOder)。")
		exit("    -Beispiel:'python %s hop'" % sys.argv[0])
	except KeyError:
		print("[Error]: Die Optionen sind unterschiedlich ('hop'Oder'step'Oder'jump'のいずれOder)。")
		exit("    -Beispiel:'python %s hop'" % sys.argv[0])

	soup_to_sphinx(page)

Wie benutzt man

python hopstepjump.py hop > hop.rst

Es ist eine Freude, eine Datei mit mehr als 1000 Zeilen mit einem einzigen Befehl zu schreiben. Wie auch immer, wenn Sie eine Konfiguration damit vornehmen, müssen Sie nur `make html oder `make pdf``` erstellen.

GitHub

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

Übrigens ist ein Ausländer, den ich nicht kenne, autorisiert. Ist das etwas Schelmisches?

Recommended Posts

(Memo) Bis Sie nur den gewünschten Teil von einer bestimmten Webseite extrahieren, konvertieren Sie ihn in eine Sphinx-Seite und drucken Sie ihn als PDF
Verwenden Sie PIL in Python, um nur die gewünschten Daten aus Exif zu extrahieren
Ich möchte mit Python nur das Gesicht aus einem Personenbild ausschneiden und speichern ~ Gesichtserkennung und Zuschneiden mit face_recognition ~
Holen Sie sich ein Bild von einer Webseite und ändern Sie die Größe
Wenn Sie möchten, dass das Thema Ihrer Sphinx-Dokumentation dasselbe ist
Geben Sie den Bericht mit Python aus DB in PDF aus, hängen Sie ihn automatisch an eine E-Mail an und senden Sie ihn
Ich möchte nur ein Signal vom Sub-Thread zum Haupt-Thread senden
[Persönliches Memo] Holen Sie sich Daten im Web und machen Sie daraus einen DataFrame
Der Infrastruktur-Shop hat beschlossen, "Web-Tools" als Thema zu entwickeln. .. Bis Sie über die Umgebung zum Erstellen von "Web-Tools" nachdenken.
Verwenden Sie Pillow, um das Bild transparent zu machen und nur einen Teil davon zu überlagern
Extrahieren Sie mit Python Daten von einer Webseite
[Python3] Machen Sie einen Screenshot einer Webseite auf dem Server und schneiden Sie sie weiter zu
Extrahieren Sie Bilder und Tabellen mit Python aus PDF, um die Berichtslast zu verringern