पायथन का उपयोग करके HTML को पार्स करना


185

मैं पायथन के लिए एक HTML पार्सर मॉड्यूल की तलाश कर रहा हूं जो मुझे पायथन सूचियों / शब्दकोशों / वस्तुओं के रूप में टैग प्राप्त करने में मदद कर सकता है।

अगर मेरे पास फॉर्म का एक दस्तावेज है:

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

तब मुझे मुझे HTML टैग के नाम या आईडी के माध्यम से नेस्टेड टैग तक पहुंचने का एक तरीका देना चाहिए, ताकि मैं मूल रूप से divटैग के class='container'भीतर निहित सामग्री, सामग्री या पाठ को प्राप्त करने के लिए कह bodyसकूं।

यदि आपने फ़ायरफ़ॉक्स के "इंस्पेक्ट एलिमेंट" फ़ीचर (HTML देखें) का उपयोग किया है, तो आपको पता होगा कि यह आपको पेड़ की तरह अच्छे नेस्टेड तरीके से सभी टैग देता है।

मैं एक बिल्ट-इन मॉड्यूल पसंद करूंगा लेकिन वह थोड़ा बहुत पूछ सकता है।


मैं स्टैक ओवरफ्लो और इंटरनेट पर कुछ ब्लॉगों पर बहुत सारे प्रश्नों के माध्यम से गया और उनमें से ज्यादातर ने ब्यूटीफुल या एलएक्सएमएल या एचटीएमएलपरर का सुझाव दिया लेकिन इनमें से कुछ ने कार्यक्षमता का विस्तार किया और बस एक बहस के रूप में समाप्त हो गया जिस पर एक तेज या अधिक प्रभावशाली है।


2
अन्य सभी उत्तरदाताओं की तरह, मैं सुंदरसुपर की सिफारिश करूंगा क्योंकि यह टूटी हुई HTML फ़ाइलों को संभालने में वास्तव में अच्छा है।
पास्कल रोज़िन

जवाबों:


195

ताकि मैं इसे बॉडी टैग में निहित क्लास = 'कंटेनर' के साथ div टैग में सामग्री / पाठ प्राप्त करने के लिए कह सकूं, या ऐसा ही कुछ।

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)

आपको प्रदर्शन विवरणों की आवश्यकता नहीं है जो मुझे लगता है - बस पढ़िए कि ब्यूटीफुल कैसे काम करता है। इसके आधिकारिक दस्तावेज को देखें


2
वास्तव में parsed_html ऑब्जेक्ट क्या है?
जुलाफ

1
parsed_html एक BeautifulSoup ऑब्जेक्ट है, इसे एक Dharmlement या DOMDocument की तरह समझें, इसके अलावा इसमें "ट्रिकी" गुण हैं, जैसे "बॉडी", सुंदरसुपर ऑब्जेक्ट को संदर्भित करेगा (याद रखें, यह मूल रूप से एक ट्री नोड है) , केवल) मूल तत्व का शरीर तत्व (हमारे मामले में, html)
आधाम

18
बस एक अपडेट: ब्यूटीफुल 4 के रूप में, आयात लाइन अब हैfrom bs4 import BeautifulSoup
बैली पार्कर

2
सामान्य जानकारी: यदि प्रदर्शन महत्वपूर्ण है, तो lxmlइसके बजाय लाइब्रेरी का बेहतर उपयोग करें (नीचे उत्तर देखें)। इसके साथ cssselectयह काफी उपयोगी है अस्वस्थ और प्रदर्शन अक्सर उपलब्ध पुस्तकालयों की तुलना में 10 से 100 गुना बेहतर है।
लेनार होयट

नोट: classविशेषता विशेष है:BeautifulSoup(html).find('div', 'container').text
१०'१६ को १

85

मुझे लगता है कि है के लिए आप क्या देख रहे हैं pyquery :

pyquery: अजगर के लिए एक jquery जैसी लाइब्रेरी।

आप क्या चाहते हैं, इसका एक उदाहरण इस प्रकार है:

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

और यह फ़ायरफ़ॉक्स या क्रोम के निरीक्षण तत्व के समान चयनकर्ताओं का उपयोग करता है। उदाहरण के लिए:

तत्व चयनकर्ता 'div # mw-head.noprint' है

निरीक्षण तत्व चयनकर्ता 'div # mw-head.noprint' है। तो pyquery में, आपको बस इस चयनकर्ता को पास करना होगा:

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

2
मैं तुम्हें इसके लिए 3000 प्यार करता हूँ!
progyammer

41

यहां आप पायथन में विभिन्न HTML पार्सर और उनके प्रदर्शन के बारे में अधिक पढ़ सकते हैं। हालांकि लेख थोड़ा दिनांकित है फिर भी यह आपको एक अच्छा अवलोकन देता है।

पायथन HTML parser प्रदर्शन

मैं भले ही इसे बनाया नहीं गया है, भले ही मैं ब्यूटीफुल की सिफारिश करूं, क्योंकि उन प्रकार के कार्यों के लिए काम करना बहुत आसान है। उदाहरण के लिए:

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

2
मैं ऐसी किसी चीज़ की तलाश कर रहा था जिसमें प्रदर्शन / दक्षता के बजाय विवरण / कार्यक्षमता हो। संपादित करें: पूर्व-परिपक्व उत्तर के लिए क्षमा करें, यह लिंक वास्तव में अच्छा है। धन्यवाद।
12:29 बजे ffledgling

सुविधाओं और कार्यों के सारांश की पहली बिंदु-सूची प्रकार :)
Qiau

5
यदि आप from bs4 import BeautifulSoup
सुंदरसो 4

29

अन्य पार्सर पुस्तकालयों की तुलना lxmlमें बहुत तेज है:

और cssselectHTML पृष्ठों को भी स्क्रैप करने के लिए उपयोग करना काफी आसान है:

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 प्रलेखन


HTTPS समर्थित नहीं
सर्जियो

@Sergio का उपयोग करें import requests, फ़ाइल को बफ़र सहेजें: stackoverflow.com/a/14114741/1518921 (या urllib), पार्स का उपयोग करके सहेजे गए फ़ाइल को लोड करने के बाद,doc = parse('localfile.html').getroot()
Guilherme Nascimento

मैं एक विशिष्ट डेटा के लिए विशाल HTML को पार्स करता हूं। BeautifulSoup के साथ इसे 1.7करने में सेकंड लग गए , लेकिन इसके बजाय lxml को लागू करने से इसे लगभग *100कई बार बढ़ाया गया ! यदि प्रदर्शन के बारे में परवाह है, तो lxml सबसे अच्छा विकल्प है
एलेक्स-बोगडानोव

9

मैं HTML पार्स करने के लिए lxml की सलाह देता हूं । देखें "पार्सिंग एचटीएमएल" (lxml साइट पर)।

मेरे अनुभव में सुंदर सूप कुछ जटिल HTML पर गड़बड़ करता है। मेरा मानना ​​है कि ऐसा इसलिए है क्योंकि सुंदर सूप एक पार्सर नहीं है, बल्कि एक बहुत अच्छा स्ट्रिंग विश्लेषक है।


3
एआईयूआई सुंदर सूप को सबसे "बैकएंड" एक्सएमएल पार्सर्स के साथ काम करने के लिए बनाया जा सकता है, एलएक्सएमएल
parser

@ffledgling सुंदरसुपर के कुछ कार्य हालांकि काफी सुस्त हैं।
लेनार होयट

2

मैं justext पुस्तकालय का उपयोग करने की सलाह देता हूं :

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

उपयोग: को 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)

0

मैं EHP का उपयोग करूंगा

https://github.com/iogf/ehp

यह रहा:

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()

आउटपुट:

Something here
Something else

5
कृपया समझाएँ। आप EHP का उपयोग लोकप्रिय BeautifulSoup या lxml पर क्या करेंगे?
1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.