web-gelistirme-sc.com

Python kullanarak HTML ayrıştırma

Etiketleri Python listeleri/sözlükler/nesneler biçiminde almama yardımcı olabilecek Python için bir HTML Ayrıştırıcı modülü arıyorum.

Eğer formun bir belgesine sahipsem:

<html>
<head>Heading</head>
<body attr1='val1'>
    <div class='container'>
        <div id='class'>Something here</div>
        <div>Something else</div>
    </div>
</body>
</html>

o zaman bana iç içe etiketlere HTML etiketinin adı veya kimliği yoluyla erişebilmem için bir yol vermeli, böylece temelde ondan div etiketi içindeki class='container' ile body etiketindeki içeriği/metni almasını isteyebilirim. .

Firefox’un “Inspect element” özelliğini (HTML’yi görüntüle) kullandıysanız, tüm etiketleri bir ağaç gibi Nice iç içe bir şekilde verdiğini bilirsiniz.

Yerleşik bir modül tercih ederim ama bu biraz fazla soruyor olabilir.


Stack Overflow ve internetteki birkaç blog hakkında birçok soru sordum ve birçoğu BeautifulSoup veya lxml veya HTMLParser'ı öneriyor ama bu fonksiyonlardan birkaçı işlevselliği detaylandırıyor ve basitçe birinin daha hızlı/daha etkili olduğu tartışmaları bitiyor.

139
ffledgling

Temel olarak, div etiketindeki içerik/metni, body etiketi içinde bulunan class = 'container', veya benzer bir şeyle almasını isteyebilirim.

try: 
    from BeautifulSoup import BeautifulSoup
except ImportError:
    from bs4 import BeautifulSoup
html = #the HTML code you've written above
parsed_html = BeautifulSoup(html)
print parsed_html.body.find('div', attrs={'class':'container'}).text

Performans açıklamalarına ihtiyacınız yok sanırım - sadece BeautifulSoup'un nasıl çalıştığını okuyun. Resmi belgelerine bakın .

155
Aadaam

Sanırım aradığın şey pyquery :

pyquery: python için jquery benzeri bir kütüphane.

İstediğinize bir örnek şöyle olabilir:

from pyquery import PyQuery    
html = # Your HTML CODE
pq = PyQuery(html)
tag = pq('div#id') # or     tag = pq('div.class')
print tag.text()

Ayrıca, Firefox’un veya Chrome’un inceleme öğesiyle aynı seçicileri kullanır. Örneğin:

the element selector is 'div#mw-head.noprint'

Denetlenen eleman seçicisi 'div # mw-head.noprint'. Dolayısıyla, satın alma işleminde bu seçiciyi geçmeniz yeterlidir:

pq('div#mw-head.noprint')
63
YusuMishi

Buradan Python'daki farklı HTML ayrıştırıcıları ve performansları hakkında daha fazla bilgi edinebilirsiniz. Makale biraz tarihli olsa da, size iyi bir genel bakış sunar.

Python HTML ayrıştırıcı performansı

Yerleşik olmasa bile BeautifulSoup'u tavsiye ederim. Sadece bu tür işler için çalışmak çok kolay olduğu için. Örneğin:

import urllib2
from BeautifulSoup import BeautifulSoup

page = urllib2.urlopen('http://www.google.com/')
soup = BeautifulSoup(page)

x = soup.body.find('div', attrs={'class' : 'container'}).text
34
Qiau

Diğer ayrıştırıcı kütüphanelere kıyasla lxml oldukça hızlıdır:

Ve cssselect ile HTML sayfalarını kazımak için kullanmak oldukça kolaydır:

from lxml.html import parse
doc = parse('http://www.google.com').getroot()
for div in doc.cssselect('a'):
    print '%s: %s' % (div.text_content(), div.get('href'))

lxml.html Dokümantasyon

20
Lenar Hoyt

HTML'yi ayrıştırmak için lxml önerilir. Bkz. "HTML Ayrıştırma" (lxml sitesinde).

Tecrübelerime göre Beautiful Soup bazı karmaşık HTML'leri bozuyor. Güzel Çorba ayrıştırıcı değil, çok iyi bir dize analizörü olduğu içindir.

Justext kütüphanesini kullanmanızı öneririm:

https://github.com/miso-belica/jusText

Kullanım: Python2:

import requests
import justext

response = requests.get("http://planet.python.org/")
paragraphs = justext.justext(response.content, justext.get_stoplist("English"))
for paragraph in paragraphs:
    print paragraph.text

Python3: 

import requests
import justext

response = requests.get("http://bbc.com/")
paragraphs = justext.justext(response.content, justext.get_stoplist("English"))
for paragraph in paragraphs:
    print (paragraph.text)
1
Wesam Na

EHP kullanırdım

https://github.com/iogf/ehp

İşte burada:

from ehp import *

doc = '''<html>
<head>Heading</head>
<body attr1='val1'>
    <div class='container'>
        <div id='class'>Something here</div>
        <div>Something else</div>
    </div>
</body>
</html>
'''

html = Html()
dom = html.feed(doc)
for ind in dom.find('div', ('class', 'container')):
    print ind.text()

Çıktı:

Something here
Something else
0
Unknown Soldier