2015-10-26 4 views
1

В Python SGMLParser, я не могу разобрать «<br/>» без пустого блока, но «<br />».В Python SGMLParser, не может разобрать «<br/>» без пустого блока, но «<br />»

я могу запустить этот код для успешного разбора HTML, но если изменить тег «<br />» до «<br/>», как только удаления пустого блока, он приводит, что я не могу разобрать HTML успешно.

Есть идеи решить эту проблему, кроме как заменить тег?

успешный пример.

# coding=utf-8 
from sgmllib import SGMLParser #get SGML 

class ListName(SGMLParser):#parser class 
    def reset(self): 
     self.is_a = False #get <a></a> 
     self.name=[] #get text 
     SGMLParser.reset(self) 
    def start_a(self,attrs): 
     self.is_a = True 

    def end_a(self): 
     self.is_a = False 

    def handle_data(self,data): 
     if self.is_a: 
      self.name.append(data) 

if __name__ == '__main__': 
    urls=''' 
    <tr> 
<td height="207" colspan="2" align="left" valign="top" class="normal"> 
<p>Damien Rice - 《0》 </p> 
<a href="http://galeki.xy568.net/music/Delicate.mp3">1. Delicate</a><br /> 
<a href="http://galeki.xy568.net/music/Volcano.mp3">2. Volcano</a><br /> 
<a href="http://galeki.xy568.net/music/The Blower's Daughter.mp3">3. The Blower's Daughter</a><br /> 
<a href="http://galeki.xy568.net/music/Cannonball.mp3">4. Cannonball </a><br /> 
<a href="http://galeki.xy568.net/music/Older Chests.mp3">5. Order Chests</a><br /> 
<a href="http://galeki.xy568.net/music/Amie.mp3">6. Amie</a><br /> 
<a href="http://galeki.xy568.net/music/Cheers Darlin'.mp3">7. Cheers Darling</a><br /> 
<a href="http://galeki.xy568.net/music/Cold Water.mp3">8. Cold water</a><br /> 
<a href="http://galeki.xy568.net/music/I Remember.mp3">9. I remember</a><br /> 
<a href="http://galeki.xy568.net/music/Eskimo.mp3">10. Eskimo</a></p> 
</td> 
</tr> 
    ''' 
listname=ListName() #init parser 
listname.feed(urls) #run parser 
print listname.name 
listname.close() 

результат:

[ '1. Нежный ',' 2. Вулкан »,« 3. Дочь Воздуха »,« 4. Cannonball ',' 5. Заказать сундуки "," 6. Amie ',' 7. Cheers Darling ',' 8. Холодная вода ',' 9. Я помню ', '10. Эскимосско ']

неправильный пример:

# coding=utf-8 
from sgmllib import SGMLParser #get SGML 

class ListName(SGMLParser):#parser class 
    def reset(self): 
     self.is_a = False #get <a></a> 
     self.name=[] #get text 
     SGMLParser.reset(self) 
    def start_a(self,attrs): 
     self.is_a = True 

    def end_a(self): 
     self.is_a = False 

    def handle_data(self,data): 
     if self.is_a: 
      self.name.append(data) 

if __name__ == '__main__': 
    urls=''' 
    <tr> 
<td height="207" colspan="2" align="left" valign="top" class="normal"> 
<p>Damien Rice - 《0》 </p> 
<a href="http://galeki.xy568.net/music/Delicate.mp3">1. Delicate</a><br/> 
<a href="http://galeki.xy568.net/music/Volcano.mp3">2. Volcano</a><br/> 
<a href="http://galeki.xy568.net/music/The Blower's Daughter.mp3">3. The Blower's Daughter</a><br/> 
<a href="http://galeki.xy568.net/music/Cannonball.mp3">4. Cannonball </a><br/> 
<a href="http://galeki.xy568.net/music/Older Chests.mp3">5. Order Chests</a><br/> 
<a href="http://galeki.xy568.net/music/Amie.mp3">6. Amie</a><br/> 
<a href="http://galeki.xy568.net/music/Cheers Darlin'.mp3">7. Cheers Darling</a><br/> 
<a href="http://galeki.xy568.net/music/Cold Water.mp3">8. Cold water</a><br/> 
<a href="http://galeki.xy568.net/music/I Remember.mp3">9. I remember</a><br/> 
<a href="http://galeki.xy568.net/music/Eskimo.mp3">10. Eskimo</a></p> 
</td> 
</tr> 
    ''' 
listname=ListName() #init parser 
listname.feed(urls) #run parser 
print listname.name 
listname.close() 

результат:

[' 1. Delicate ']

ответ

0

Возможно, бит <br/> анализируется как начальный тег net-enable.

SGML имеет довольно много ярлыков («минимизация»), которые позволяют опустить части своего синтаксиса. NET, для «null end tag», является одним из них; это способ избежать написания конечного тега в целом и вместо этого использовать косую черту. Для example, в SGML, написание

<ISBN/0 201 17535 5/ 

такая же, как написание

<ISBN>0 201 17535 5</ISBN> 

замена всех <br/> в вашем неверном примере с <br// дает ожидаемый результат.

Это говорит о том, что оба входа выглядят как почти допустимый HTML, а не SGML - вы считали, что вместо этого используете синтаксический анализатор HTML или XML? Например, с Beautiful Soup:

from bs4 import BeautifulSoup 
urls = ... 
soup = BeautifulSoup(urls, "html.parser") 
print([a.get_text() for a in soup.find_all('a')])