在Python SGMLParser中,我无法解析&#39; <br/>
&#39;没有空栏但是&#39; <br />
&#39;
我可以运行此代码以成功解析html,但是如果我更改了标签,请{&#39; <br />
&#39;到&#39; <br/>
&#39;因为只是删除空块,结果是我无法成功解析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()
结果是:
[&#39; 1。精致&#39;,&#39; 2。 Volcano&#39;,&#34; 3。鼓风机的女儿&#34;,&#39; 4。炮弹&#39;,&#39; 5。订购箱子&#39;,&#39; 6。 Amie&#39;,&#39; 7。干杯达林&#39;,&#39; 8。冷水&#39;,&#39; 9。我记得&#39;,&#39; 10。爱斯基摩&#39;]
错误的例子:
# 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()
结果是:
[&#39; 1。细腻&#39;]
答案 0 :(得分:0)
可能是<br/>
位被解析为启用网络的开始标记。
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')])