Monday, August 31, 2015

თავი12 (12,5 - 12,7)

12.5 Parsing HTML and scraping the web


პითონში urllib-ის შესაძლებლობებს ყველაზე ხშირად იყენებენ ვების „გასაწმენდად“.  ვების გაწმენდა ნიშნავს როცა ჩვენ დავწერეთ პროგრამა რომელიც სიმულირებდა ვებ ბრაუზერს, პოულობდა გვერდებს, შემდეგ იკვლევდა მონაცემებს ამ გვერდებზე და ეძებდა ნიმუშებს.
მაგალითად გუგლის საძიებო სისტემა „ჩაიხედება“ ვებ გვერდის კოდში, ამოიღებს სხვა გვერდების ლინკებს, მოძებნის ამ გვერდებს, უკვე ამ გვერდებზე ამოიღებს ლინკებს და.ა.შ. ამ ტექნიკის გამოყენებით გუგლი  თავის გზაზე ქსელს აბამს ვების ყველა გვერდზე.
გუგლი ასევე იყენებს ბმულებს ამ გვერდებიდან იმის გასაგებად თუ რამდენად „საჭირო“ გვერდებია და ამის მიხედვით ადგენს რამდენად ხშირად გამოაჩინოს ძებნის შედეგებში.


12.6 Parsing HTML using Regular Expressions


მარტივი გზა HTML-ის გასარჩევად არის რეგულარული გამოსახულების გამოყენება, რომ არაერთხელ მოძებნოს და ამოიღოს ქვესტრინგები, რომელიც ემთხვევა კონკრეტულ ნიმუშს.

აქაა მარტივი ვებ გვერდი:

<h1>The First Page</h1>
<p>
If you like, you can switch to the
<a href="http://www.dr-chuck.com/page2.htm">
Second Page</a>.
</p>

შეგიძლია გააკეთო კარგად ფორმირებული რეგულარული გამოსახულება რომ დაამთხვიო და ამოიღო ლინკი ზემო ტექსტიდან:

href="http://.+?"

ჩვენი რეგულარული გამოსახულება ეძებს სტრინგებს, რომელიც იწყება href=http://-ით, რასაც მოყვება ერთი ან მეტი სიმბოლო „.+?" და ორმაგი ბრჭყალი.  კითხვის ნიშანი მიუთითებს, რომ დამთხვევა უნდა მოხდეს „არა-ხარბ“ რეჟიმში. ასეთი რეჟიმი ცდილობს იპოვნოს ყველზე პატარა დამთხვეული სტრინგი და ხარბი ცდილობს იპოვნოს ყველაზე დიდი დამთხვეული სტრინგი.
საჭიროა რეგულარულ გამოსახულებას დავამატოთ ფრჩხილები იმის საჩვენებლად თუ რომელი ნაწილი ამოიღოს დამთხვეული სტრინგიდან:

import urllib
import re

url = raw_input('Enter - ')
html = urllib.urlopen(url).read()
links = re.findall('href="(http://.*?)"', html)
for link in links:
    print link

findall მეთოდი მოგვცემს სიას ყველა სტრინგისა, რომელიც დაემთხვა რეგულარულ გამოსახულებას და დააბრუნებს მხოლოდ ლინკს ორმაგ ბრჭყალებს შორის.

პროგრამას როცა გავუშვებთ ამონაბეჭდი იქნება შემდეგი:

python urlregex.py
Enter - http://www.dr-chuck.com/page1.htm
http://www.dr-chuck.com/page2.htm

python urlregex.py
Enter - http://www.py4inf.com/book.htm
http://www.greenteapress.com/thinkpython/thinkpython.html
http://allendowney.com/
http://www.py4inf.com/code
http://www.lib.umich.edu/espresso-book-machine
http://www.py4inf.com/py4inf-slides.zip


რეგულარული გამოსახულება მუშაობს ძალიან კარგად, როცა HTML არის კარგად ფორმირებული და პროგნოზირებადი.  მაგრამ რადგან არსებობს ბევრი „არეული“ გვერდი, მხოლოდ რეგულარული გამოსახულების გამოყენებით შეიძლება წააწყდე ცუდ მონაცემებს ან კარგი მონაცემები გამოტოვო.
ამ პრობლემის გადაჭრა შეიძლება HTML გარჩევის ბიბლიოთეკით.

12.7 Parsing HTML using BeautifulSoup


პითონში არსებობს რამდენიმე ბიბლიოთეკა, რომელიც დაგეხმარება HTML-ის გარჩევაში და გვერდებიდან მონაცემების ამოღებაში. თითოეულ ბიბლიოთეკას აქვს თავის სიძლიერე და სისუსტე და შენ შეგიძლია ამოირჩიო ერთ-ერთი შენი საჭიროების მიხედვით.
მაგალითად, მარტივად გავარჩევთ HTML- და ამოვიღებთ ლინკებს BeautifulSoup ბიბლიოთეკის გამოყენებით. შეგიძლია გადაიწერო და დააყენო BeautifulSoup კოდი აქედან:

www.crummy.com

შეგიძლია გადაიწერო და დააყენო BeautifulSoup ან ჩასვა BeautifulSoup.py ფაილი იგივე საქაღალდეში სადაც აპლიკაციაა.

მიუხედავად იმისა, რომ HTML ჰგავს XML - ზოგიერთი გვერდი ყურადღებითაა გაკეთებული, როგორც XML, უმეტესობა HTML-სა „არეულია“ იმგვარად, რომ იწვევს XML გამრჩევის მიერ მთლიანი HTML გვერდის უარყოფას, როგორც შეუსაბამოდ ფორმირებული გვერდის.
BeautifulSoup ტოლერანტულია დიდი დეფექტის მქონე HTML-ის მიმართ და საშუალებას გაძლევს ამოიღო საჭირო მონაცემები.
გვერდის წასაკითხად  და შემდეგ BeautifulSoup-ს anchor (a) ტაგიდან href ატრიბუტების ამოსაღებად გამოვიყენებთ urllib-ს.

import urllib
from BeautifulSoup import *

url = raw_input('Enter - ')
html = urllib.urlopen(url).read()
soup = BeautifulSoup(html)
# Retrieve all of the anchor tags
tags = soup('a')
for tag in tags:
print tag.get('href', None)




პროგრამა ითხოვს ვებ მისამართს, შემდეგ ხსნის ვებ გვერდს, კითხულობს მონაცემებს, შეაქვს მონაცემები BeautifulSoup-ში გასარჩევად, შემდეგ პოულობს ყველა anchor ტაგს და ბეჭდავს href ატრიბუტებს ყოველი ტაგისთვის.

ამონაბეჭდი იქნება შემდეგი:

python urllinks.py
Enter - http://www.dr-chuck.com/page1.htm
http://www.dr-chuck.com/page2.htm

python urllinks.py
Enter - http://www.py4inf.com/book.htm
http://www.greenteapress.com/thinkpython/thinkpython.html
http://allendowney.com/
http://www.si502.com/
http://www.lib.umich.edu/espresso-book-machine
http://www.py4inf.com/code
http://www.pythonlearn.com/

ტაგების სხვადასხვა ნაწილების ამოსაღებად შეგიძლია გამოიყენო:

import urllib
from BeautifulSoup import *

url = raw_input('Enter - ')
html = urllib.urlopen(url).read()
soup = BeautifulSoup(html)

# Retrieve all of the anchor tags
tags = soup('a')
for tag in tags:
# Look at the parts of a tag
print 'TAG:',tag
print 'URL:',tag.get('href', None)
print 'Content:',tag.contents[0]
print 'Attrs:',tag.attrs

ამას აქვს შემდეგი ამონაბეჭდი:

python urllink2.py             
Enter - http://www.dr-chuck.com/page1.htm
TAG: <a href="http://www.dr-chuck.com/page2.htm">
Second Page</a>
URL: http://www.dr-chuck.com/page2.htm
Content: [u'\nSecond Page']
Attrs: [(u'href', u'http://www.dr-chuck.com/page2.htm')]

ეს მაგალითები აჩვენებს HTML-ის გარჩევაში BeautifulSoup-ის სიძლიერის მცირე ნაწილს. დოკუმენტაცია და მაგალითები შეგიძლია ნახო აქ www.crummy.com.