我有以下代码:
*** REST OF CODE OMITTED ***
try:
fullURL = blitzurl + movie
opener.open(blitzurl)
urllib2.install_opener(opener)
request = urllib2.Request(fullURL)
requestData = urllib2.urlopen(request)
htmlText = BeautifulSoup(requestData.read())
#panel = htmlText.find(match_class(["panelbox"]))
#table = htmlText.find("table", {"id" : "scheduletbl"})
print htmlText
blah....
except Exception, e:
print str(e)
print "ERROR: ERROR OCCURED IN MAIN"
我试图获取一个id为“scheduletbl”的表的内容(在一个名为“panelbox”的类的div中)
html代码如下所示:
*** REST OF CODE OMITTED ***
<div class="panelbox">
<!-- !!!! content here !!!!! -->
<table border="0" cellpadding="2" cellspacing="0" id="scheduletbl" width="95%">
<tr>
<td align="left" colspan="3">
VC = Special Cinema (Velvet Class)<br/>
VS = Special Cinema (Velvet Suite)<br>
DC = Special Cinema (Dining Cinema)<br/>
S = Special Cinema (Satin)<br/>
3D = in RealD 3D<br/>
4DX = 4DX Cinema
</br></td>
</tr>
<tr>
<td class="separator2" colspan="3"><strong>BLITZMEGAPLEX - PARIS VAN JAVA, BANDUNG</strong></td>
</tr>
<tr>
<td colspan="3"><img align="left" height="16" hspace="5" src="../img/ico_rss_schedule_white.gif" width="16"/><strong><a class="navlink" href="../rss/schedule.php">RSS- Paris van Java</a></strong></td>
</tr>
<tr>
<td class="separator">Â </td>
<td class="separator" colspan="2">TUESDAY, 24 SEPTEMBER 2013</td>
</tr>
<tr>
<td class="separator">Â </td>
<td class="separator" rel="2D" width="20%">
10:30Â Â Â
</td>
<td class="separator" width="30%">
<a class="navlink" href="https://www.blitzmegaplex.com/olb/seats.php?showdate=2013-09-24&cinema=0100&movie=MOV1954&showtime=10:30&suite=N&movieformat=2D" target="_blank">Buy Tickets</a></td>
</tr></table></div></div>
<tr>
*** and more <tr> tags ***
*** REST OF CODE OMITTED ***
我遇到的问题是,当我尝试根据div-id提取内容时,它会在中间切断(我猜是因为不正确的结束标记)。
当我尝试基于(使用其id)提取内容时,也会发生这种情况。它也将在中间切断,因为有一个,它不应该在那里。
解决此问题的最佳方法是什么?我无法控制数据,因为它是从某个网站上删除的。
答案 0 :(得分:0)
如果您正在使用python默认包含的解析器,则不正确的结束标记可能会产生问题。就像在美丽的汤文档中所说的那样:不是很宽松(在Python 2.7.3或3.2.2之前)。
因此,如果您之前使用的是该版本,则可以安装更宽松的lxml HTML解析器
$ pip install lxml
或者如果你想要与浏览器完成相同的html解析,你可以安装html5lib解析器
$ pip install html5lib
他们可能会更好地解析您的HTML并且能够适应不良标记关闭。美丽的汤会自动选择您安装的最佳解析器。
答案 1 :(得分:0)
re.search(r'id="scheduletbl".+?</table>', page, re.DOTALL)
如果涉及换行,请点播。这是一种难看的非美丽方式
答案 2 :(得分:0)
您可以尝试使用https://scraperwiki.com/ - 如果您希望检查哪个工具/库最适合此任务。
有一个使用html5lib,pyquery,bs4等的选项(很容易测试)
你可以试试beautifulsoup:
BeautifulSoup(html).prettify()
其中html是您的内容
BS应该擅长处理糟糕的HTML ......