【问题标题】:Search HTML line by line with regex in Python在 Python 中使用正则表达式逐行搜索 HTML
【发布时间】:2012-04-18 16:03:41
【问题描述】:

我正在尝试根据这个日历创建一个小时字典:http://disneyworld.disney.go.com/parks/magic-kingdom/calendar/

<td class="first"> <div class="dayContainer">
      <a href="/parks/magic-kingdom/calendardayview/?asmbly_day=20120401"> 
         <p class="day"> 1
         </p> <p class="moreLink">Park Hours<br />8:00 AM - 12:00 AM<br /><br/>Extra Magic Hours<br />7:00 AM - 8:00 AM<br /><br/>Extra Magic Hours<br />12:00 AM - 3:00 AM<br /><br/>
         </p> 
      </a> 
   </div>
</td> 

每个日历条目都在一行上,所以我认为最好逐行浏览 HTML,如果该行包含小时,则将这些小时添加到相应日期的字典中(有些days 有多个小时的条目)。

import urllib
import re
source = urllib.urlopen('http://disneyworld.disney.go.com/parks/magic-kingdom/c\
alendar/')
page = source.read()
prkhrs = {}

def main():
    parsehours()

def parsehours():
    #look for #:## AM - #:## PM                                                 
    date = r'201204\d{02}'
    hours = r'\d:0{2}\s\w{2}\s-\s\d:0{2}\s\w{2}'
    #go through page line by line                                               
    for line in page:
        times = re.findall(hours, line)
        dates = re.search(date, line)
        if dates:
            start = dates.start()
            end = dates.end()
            curdate = line[start:end]
        #if #:## - #:## is found, a date has been found                         
        if times:
            #create dictionary from date, stores hours in variable              
            #extra magic hours(emh) are stored in same format.                  
            #if entry has 2/3 hour listings, those listings are emh             
            prkhrs[curdate]['hours'] = times
    #just print hours for now. will change later                                
    print prkhrs

我遇到的问题是,当我将“打印行”放在遍历页面的 for 循环中时,它一次打印出一个字符,我认为这是搞砸了。

现在,'print prkhrs' 什么都不打印,但是使用 re.findall 来打印日期和时间会打印出正确的时间,所以我知道正则表达式有效。关于如何让它工作的任何建议?

【问题讨论】:

  • 解析 HTML - 不要正则表达式
  • @Mimisbrunnr,尽管标题和标签,这似乎没有使用正则表达式来解析 HTML。
  • 这看起来像是 BeautifulSoup 的工作
  • @aaronasterling - westbyb 正在通过使用正则表达式从文档中解析数据。他可能不会直接自己解析 HTML,但将 HTML 转换为具有代表性的对象结构并从那里有用地提取数据会容易得多。
  • @Mimisbrunnr - 你会如何建议我这样做?正则表达式确实是我知道的唯一方法,至少现在是这样。

标签: python html regex


【解决方案1】:

page = source.read() 更改为page = source.readlines()

source.read() 将整个页面作为一个大字符串返回。遍历一个字符串(就像你做for line in page一样)一次返回一个字符。仅仅因为你的变量被称为 linepage 并不意味着 Python 知道你想要什么。

source.readlines() 返回一个字符串列表,每个字符串都是页面中的一行。

【讨论】:

  • FWIW,我同意评论者的观点,即与其以这种方式使用正则表达式,不如正确解析 HTML。但是,对于您实际提出的问题,这是一个有效的答案。
  • 做到了!我遇到了其他一些问题,但这解决了手头的问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-11-16
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多