使用 Python 正则表达式在两个变量之间查找 HTML

Posted

技术标签:

【中文标题】使用 Python 正则表达式在两个变量之间查找 HTML【英文标题】:Find HTML between two variables using Python regex 【发布时间】:2015-02-16 11:58:40 【问题描述】:

Python 新手

试图从网页中抓取一些所需的信息。我想得到的第一件事是今天和昨天日期之间的所有 html。这是我到目前为止所拥有的

import datetime
import urllib
import re

t = datetime.date.today()
t1 = t.strftime("%B %d, %Y")
y = datetime.date.today() - datetime.timedelta(1)
y1 = y.strftime("%B %d, %Y")

htmlfile = urllib.urlopen("http://www.blu-ray.com/itunes/movies.php?show=newreleases")
htmltext = htmlfile.read()

block1 = re.search(t1 + r'(.*)' + re.escape(y1), htmltext)
print block1

据我所知(我可能错了),我的正则表达式应该抓住我想要的,这样我就可以开始只从今天的日期提取信息。但它返回“无”。

我确信这只是我的有限理解,因为我是新手,但任何帮助将不胜感激。非常感谢!

【问题讨论】:

问题是.* 不匹配换行符。但是你真的应该使用 HTML 解析器,就像 alecxe 说的那样。 【参考方案1】:

Don't use regular expression for parsing HTML,使用 HTML 解析器,例如 BeautifulSoup

这将是很多代码,但想法是遍历所有包含指定格式 (%B %d, %Y) 日期的 h3 元素,然后获取所有 next table tags,直到我们遇到另一个 @987654328 @标签或结束:

from datetime import datetime
import urllib
from bs4 import BeautifulSoup

data = urllib.urlopen("http://www.blu-ray.com/itunes/movies.php?show=newreleases")
soup = BeautifulSoup(data)

def is_date(d):
    try:
        datetime.strptime(d, '%B %d, %Y')
        return True
    except (ValueError, TypeError):
        return False

for date in soup.find_all('h3', text=is_date):
    print date.text

    for element in date.find_next_siblings(['h3', 'table']):
        if element.name == 'h3':
            break

        print element.a.get('title')
    print "----"

打印:

December 17, 2014
App (2013)
----
December 16, 2014
The Equalizer (2014)
Annabelle (2014)
A Walk Among the Tombstones (2014)
The Guest (2014)
Men, Women & Children (2014)
At the Devil's Door (2014)
The Canal (2014)
The Bitter Tears of Petra von Kant (1972)
Avatar (2009)
Atlas Shrugged Part III: Who Is John Galt? (2014)
Expelled (2014)
Level Five (1997)
The Device (2014)
Two-Bit Waltz (2014)
The Devil's Hand (2014)
----
December 15, 2014
Star Trek: The Next Generation, Season 6 (1992-1993)
Ristorante Paradiso, Season 1 (2009)
A Certain Magical Index II, Season 2, Pt. 2 (2011)
Cowboy Bebop, The Complete Series (1998-1999)

请随时就发布的代码提出其他问题 - 很乐意为您解释。

【讨论】:

【参考方案2】:

您的代码在t.strftime("%B %d, %Y") 上引发错误。

该行的正确格式是t1 = strftime("%B %d, %Y", t)

我也得到:TypeError: argument must be 9-item sequence, not datetime.datetime

从这个错误中,您可以搜索许多解决方案。我不知道您使用的是哪个版本的 Python,但解决方案会使用整个时间,而不仅仅是日期。所以你可能需要把时间减去一天。

请看这里:Extract time from datetime and determine if time (not date) falls within range?

在这里:How can I generate POSIX values for yesterday and today at midnight in Python?

【讨论】:

以上是关于使用 Python 正则表达式在两个变量之间查找 HTML的主要内容,如果未能解决你的问题,请参考以下文章

通过Python中的正则表达式优化在两个列表之间查找匹配子字符串

不止一次用正则表达式替换两个字符串之间的字符串,python

使用正则表达式查找两个字符串之间的多个匹配项

正则表达式在两个字符串(它们是变量)之间提取

在两个html标签之间查找正则表达式[重复]

IntelliJ IDEA 查找两个字符之间任意内容正则表达式