2009-10-27 12 views
5

मुझे एक पार्सर में दिलचस्पी है जो एक विकृत HTML पृष्ठ ले सकता है, और इसे कुछ XPath क्वेरी करने से पहले इसे अच्छी तरह से बनाए गए HTML में बदल सकता है। किसी के बारे में पता है?आप पर्ल में विकृत HTML कैसे संभालते हैं?

+0

आप जो करने की कोशिश कर रहे हैं उस पर निर्भर करता है। मैं नियमित रूप से किसी भी के बारे में चिंता किए बिना गड़बड़ वाले HTML स्रोत के गीगाबाइट्स का विश्लेषण करता हूं। –

+0

आप यह कैसे कर रहे हैं? मैंने एलडब्लूपी :: उपयोगकर्ता एजेन्ट के साथ संयोजन में एक्सएमएल :: XPath का उपयोग करने की कोशिश की, और एक्सएमएल :: XPath एक विकृत त्रुटि के साथ विफल रहा। हो सकता है कि आप अपनी रणनीति को उत्तर के रूप में पोस्ट करना चाहें। – Geo

+1

उत्तर हाथ पर विशिष्ट कार्य पर निर्भर करता है। आपका प्रश्न एक विशिष्ट उत्तर देने के लिए बहुत अस्पष्ट है। सबसे पहले, हालांकि, HTML को XML के रूप में पार्स करने का प्रयास न करें। एक HTML पार्सर का प्रयोग करें। –

उत्तर

13

आपको एचटीएमएल पार्सर का उपयोग HTML का विश्लेषण करने के लिए नहीं करना चाहिए। एक HTML पार्सर का प्रयोग करें।

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
    "http://www.w3.org/TR/html4/strict.dtd"> 

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>Is this valid?</title> 
</head> 

<body> 

<p>This is a paragraph 

<table> 

<tr> <td>cell 1 <td>cell 2 
<tr> <td>cell 3 <td>cell 4 

</table> 

</body> 

</html> 

कई कार्य विशिष्ट (सामान्य प्रयोजन के अतिरिक्त) कर रहे हैं CPAN पर HTML पारसर्स:

ध्यान दें कि निम्नलिखित पूरी तरह से वैध एचटीएमएल (और एक XML पार्सर उस पर गला घोंटना होगा) है। उन्होंने बेहद गन्दा (और अधिकांश समय अमान्य) HTML की एक विशाल विविधता पर मेरे लिए पूरी तरह से काम किया है।

यदि आप हल करने का प्रयास कर रहे समस्या को निर्दिष्ट कर सकते हैं तो विशिष्ट अनुशंसाएं देना संभव होगा।

HTML::TreeBuilder::XPath भी है जो दस्तावेज़ को पेड़ में पार्स करने के लिए HTML::Parser का उपयोग करता है और फिर आपको XPath का उपयोग करके क्वेरी करने की अनुमति देता है। मैंने कभी इसका इस्तेमाल नहीं किया है लेकिन रैंडल श्वार्टज़ के HTML Scraping with XPath देखें।

को देखते हुए HTML फ़ाइल से ऊपर, निम्नलिखित कम स्क्रिप्ट:

#!/usr/bin/perl 

use strict; use warnings; 

use HTML::TreeBuilder::XPath; 
my $tree= HTML::TreeBuilder::XPath->new; 

$tree->parse_file("valid.html"); 
my @td = $tree->findnodes_as_strings('//td'); 

print $_, "\n" for @td; 

आउटपुट:

 
C:\Temp> z 
cell 1 
cell 2 
cell 3 
cell 4 

यहां प्रमुख मुद्दा है कि दस्तावेज़ एक HTML दस्तावेज के रूप में एक HTML पार्सर (द्वारा पार्स किया गया है इस तथ्य के बावजूद कि हम XPath का उपयोग करके इसे क्वेरी करने में सक्षम थे)।

1

जब तक आप learn more about wheels पर नज़र डाल रहे हैं, तो HTML Tidy कोड का उपयोग करें।

+1

पर्ल प्रोग्रामर के लिए उपलब्ध कार्य-विशिष्ट पार्सर की पर्याप्तता के साथ, यह शायद ही कभी आवश्यक है। –

+0

पिछले 5 वर्षों से मैंने पर्ल के साथ काम किया था ... इसका अनुमान लगाएं। – AnonJr

1

आप इस तरह सवाल अलग तरीके से व्यक्त कर सकते हैं:

में अच्छी तरह से प्रदर्शन से पहले का गठन एचटीएमएल सी स्रोत मैं एक पार्सर कि एक विकृत HTML पृष्ठ सी स्रोत ले सकता है, और उसे चालू में दिलचस्पी रखता हूँ कुछ XPath क्वेरी संकलन और उस पर लिंकिंग। किसी के बारे में पता है?

अब सवाल थोड़ा और स्पष्ट हो सकता है: यह आसान नहीं होगा। यदि यह वास्तव में विकृत HTML है, तो आपको हाथ से काम करने की आवश्यकता हो सकती है जब तक कि इसे HTML पार्सर में खिलाया जा सके। फिर, आप काम करने के लिए यहां प्रस्तुत किसी भी अन्य मॉड्यूल का उपयोग कर सकते हैं। यह असंभव है कि आप कभी भी कच्चे HTML को सख्ती से वैध xhtml में प्रोग्रामेटिक रूप से अनुवाद कर सकते हैं।

संबंधित मुद्दे