【发布时间】:2009-08-09 21:16:30
【问题描述】:
我需要网页内容。我需要从中获取一些数据。它看起来像:
数据
据我了解,我必须使用正则表达式,但我不能选择一个。
我尝试了下面的代码,但没有任何结果。请纠正我:
regexHandler = re.compile('(<div class="deg">(?P<div class="deg">.*?)</div>)')
result = regexHandler.search( pageData )
【问题讨论】:
我需要网页内容。我需要从中获取一些数据。它看起来像:
数据
据我了解,我必须使用正则表达式,但我不能选择一个。
我尝试了下面的代码,但没有任何结果。请纠正我:
regexHandler = re.compile('(<div class="deg">(?P<div class="deg">.*?)</div>)')
result = regexHandler.search( pageData )
【问题讨论】:
我建议使用一个好的 HTML 解析器(例如 BeautifulSoup - 但出于您的目的,即使用格式良好的 HTML 作为输入,Python 标准库附带的那些,例如 HTMLParser,也应该运行良好)而不是原始 RE 来解析 HTML。
如果你想坚持原始的 RE 方法,模式:
r'<div class="deg">([^<]*)</div>'
看起来像是从字符串 '<div class="deg">DATA</div>' 中获取字符串 'DATA' 的最简单方法——假设这就是您所追求的。您可能需要在需要容忍可选空格的位置添加一个或多个 \s*。
【讨论】:
([^<]*) 组?非贪婪的.*? 应该可以正常工作。
.*? 将容忍(并吸收)嵌入的标签,并且如果 div 包含另一个 div 内部(抓住内部目录的开始而不是结束),则会失去平衡,而模式 I建议只会在 div 包含纯文本数据时匹配,即没有嵌入标签,这在没有明确规范的情况下似乎更合理。此类复杂性是我开始推荐避免裸 RE 用于 HTML 解析的部分原因,并为此目的重用标准库和第三方模块中的许多优秀现有模块中的任何一个.
如果您希望匹配项中包含 div 标签:
regexpHandler = re.compile('(<div class="deg">.*?</div>)')
如果您不想包含 div 标签,则只包含 DATA 部分:
regexpHandler = re.compile('<div class="deg">(.*?)</div>')
然后运行匹配并得到结果:
result = regexHandler.search( pageData )
matchedText = result.groups()[0]
【讨论】:
result.groups()[0] 而不是 result.group() 才能获得捕获匹配,而不是匹配整个字符串。 :)
你可以在 Python 中使用简单的字符串函数,不需要正则表达式
mystr = """< div class="deg">DATA< /div>"""
if "div" in mystr and "class" in mystr and "deg" in mystr:
s = mystr.split(">")
for n,item in enumerate(s):
if "deg" in item:
print s[n+1][:s[n+1].index("<")]
我的方法,找点东西分开。例如,在上面,我拆分为“>”。然后遍历拆分的项目,检查“deg”,并获取它之后的项目,因为“deg”出现在您要获取的数据之前。当然,这不是唯一的方法。
【讨论】:
虽然可以使用 rexex 进行快速和肮脏的 html 处理,但更好和更清洁的方法是使用像 lxml.html 这样的 html 解析器并使用 XPath 或 CSS Selectors 查询解析的树。
html = """<html><body><div class="deg">DATA1</div><div class="deg">DATA2</div></body></html>"""
import lxml.html
page = lxml.html.fromstring(html)
#page = lxml.html.parse(url)
for element in page.findall('.//div[@class="deg"]'):
print element.text
#using css selectors
from lxml.cssselect import CSSSelector
sel = CSSSelector("div.deg")
for element in sel(page):
print element.text
【讨论】: