【问题标题】:Python scraping data with improper html structurePython使用不正确的html结构抓取数据
【发布时间】:2013-09-29 04:11:16
【问题描述】:

我有以下代码:

*** 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&amp;cinema=0100&amp;movie=MOV1954&amp;showtime=10:30&amp;suite=N&amp;movieformat=2D" target="_blank">Buy Tickets</a></td>
</tr></table></div></div>

<tr>
*** and more <tr> tags ***
*** REST OF CODE OMITTED ***

我遇到的问题是,当我尝试根据 div-id 提取内容时,它会在中间被截断(我猜是因为关闭标签不正确)。

当我尝试基于(使用其 id)提取内容时,也会发生这种情况。它也会在中间被切断,因为有一个 ,它不应该在那里。

解决此问题的最佳方法是什么?我无法控制这些数据,因为它是从某个网站上抓取的。

【问题讨论】:

    标签: python html python-2.7 web-scraping beautifulsoup


    【解决方案1】:

    如果您使用的是 python 默认包含的解析器,则不正确的结束标记可能会产生问题。正如美丽汤文档中所说:不是很宽松(在 Python 2.7.3 或 3.2.2 之前)。

    所以,如果你使用的是之前的版本,你可能会安装 lxml 的 HTML 解析器,它更宽松

    $ pip install lxml
    

    或者如果你想要和浏览器一样的 html 解析,你可以安装 html5lib 解析器

    $ pip install html5lib
    

    它们可能会更好地解析您的 HTML,并且能够适应错误的标签关闭。 Beautiful soup 会自动选择您安装的最佳解析器。

    【讨论】:

    • 感谢...您的建议。不幸的是我在windows机器上(这意味着我必须安装gcc等效或windows)该死的......不过,我会尝试的。再次感谢您的建议。
    • 不,你不需要,你只需安装 pip 并安装那些解析器,就像馅饼一样简单。 stackoverflow.com/questions/4750806/…
    • 最简单的方法是(感谢 Gringo,来自上面的链接)stackoverflow.com/a/14407505/2303994
    • 我的意思是我已经安装了 pip(有几个包),只是如果我想安装 lxml 它总是会抛出错误(这现在完全超出了主题)。
    【解决方案2】:
    re.search(r'id="scheduletbl".+?</table>', page, re.DOTALL) 
    

    dotall 如果涉及换行符。这是丑陋的非美丽方式

    【讨论】:

      【解决方案3】:

      您可以尝试使用https://scraperwiki.com/ - 如果您想检查哪个工具/lib 最适合您完成这项任务。

      可以选择使用html5lib、pyquery、bs4等(简单测试)

      你可以试试beautifulsoup:

      BeautifulSoup(html).prettify()
      

      html 是你的内容

      BS应该擅长处理糟糕的html...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-29
        • 2020-06-03
        • 1970-01-01
        • 1970-01-01
        • 2019-08-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多