2014-12-09 3 views
1

Я пытаюсь разобрать определенный набор ссылок из html-файла, но поскольку я использую HTMLParser, я не могу получить доступ к информации о html в дереве иерархии и, следовательно, я не могу извлечь эту информацию.Разделяйте конкретные ссылки в html с помощью HTMLParser в python?

Мой HTML выглядит следующим образом:

<p class="mediatitle"> 
     <a class="bullet medialink" href="link/to/a/file">Some Content 
     </a> 
</p> 

Так что мне нужно, чтобы извлечь все значения, которые имеют свой ключ как «HREF» и предыдущий атрибут как класс = «пули MediaLink». Другими словами, я хочу только Thode hrefs, которые присутствуют в теге класса «пули MediaLink»

То, что я пытался до сих пор является

from HTMLParser import HTMLParser 
import urllib 
# create a subclass and override the handler methods 
class MyHTMLParser(HTMLParser): 
def handle_starttag(self, tag, attrs): 
    if(tag == 'a'): 
     for (key,value) in attrs: 
      if(value == 'bullet medialink'): 
       print "attr:", key 

p = MyHTMLParser() 
f = urllib.urlopen("sample.html") 
html = f.read() 
p.feed(html) 
p.close() 

ответ

0

Так что я, наконец, сделал это с простой логический флаг в силу тот факт, что HTMLParser не является пакетом иерархического парсера.

Вот код

from HTMLParser import HTMLParser 
import urllib 
# create a subclass and override the handler methods 
class MyHTMLParser(HTMLParser): 
def handle_starttag(self, tag, attrs): 
    if(tag == 'a'): 
     flag = 0 
     for (key,value) in attrs: 
       if(value == 'bullet medialink' and key == 'class'): 
        flag =1 
       if(key == 'href' and flag == 1):  
        print "link : ",value 
        flag = 0   

p = MyHTMLParser() 
f = urllib.urlopen("sample.html") 
html = f.read() 
p.feed(html) 
p.close() 

Надежда кто-то приходит с более элегантным решением.

1

Я хотел бы Bs4 для этого. Bs4 - сторонний анализатор html. Документация: http://www.crummy.com/software/BeautifulSoup/bs4/doc/

import urllib 
from bs4 import BeautifulSoup 

f = urllib.urlopen("sample.html") 
html = f.read() 
soup = BeautifulSoup(html) 
for atag in soup.select('.bullet.medialink'): # Just enter a css-selector here 
    print atag['href'] # You can also get an atrriibute with atag.get('href') 

Или короче:

import urllib 
from bs4 import BeautifulSoup 

soup = BeautifulSoup(urllib.urlopen("sample.html").read()) 
for atag in soup.select('.bullet.medialink'): 
    print atag 
+0

Большое спасибо. но поскольку я создаю скрипт, который будет использоваться многими людьми, я хочу сохранить его простым, используя только встроенные функции разбора python. –

+0

Хмм. Может быть, вы можете взглянуть на библиотеку inbuild etree https: //docs.python. org/2/library/xml.etree.elementtree.html Это не самое лучшее, но всегда лучше, чем htmlparser. И если вы передумаете, вы всегда можете использовать lxml.de. Он использует библиотеку etree, но с ней лучше работать. –