Python 和网页标签正则表达式

1 投票
4 回答
5025 浏览
提问于 2025-04-15 13:29

我需要网页上的内容。我想从中获取一些数据。它的格式看起来像这样:

< div class="deg">DATA< /div>

根据我的理解,我需要使用正则表达式,但我不知道该用哪个。

我尝试了下面的代码,但没有得到任何结果。请帮我纠正一下:

regexHandler = re.compile('(<div class="deg">(?P<div class="deg">.*?)</div>)')
result = regexHandler.search( pageData )

4 个回答

0

虽然用正则表达式(regex)来快速处理HTML是可以的,但其实有一种更好、更干净的方法,那就是使用像 lxml.html 这样的HTML解析器。你可以用 XPathCSS选择器 来查询解析后的树形结构。

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
6

我建议使用一个好的HTML解析器,比如BeautifulSoup。不过如果你处理的是格式正确的HTML,Python自带的库里的解析器,比如HTMLParser,也能很好地完成这个任务。

如果你还是想用原始的正则表达式方法,可以试试这个模式:

r'<div class="deg">([^<]*)</div>'

这个方法看起来是从字符串'<div class="deg">DATA</div>'中提取出'DATA'的最简单方式——前提是你就是想要这个结果。你可能需要在某些地方加上一个或多个\s*,这样可以处理可选的空格。

3

如果你想要在匹配的项目中包含div标签:

regexpHandler = re.compile('(<div class="deg">.*?</div>)')

如果你只想要数据部分,不想要div标签:

regexpHandler = re.compile('<div class="deg">(.*?)</div>')

然后运行匹配并获取结果:

result = regexHandler.search( pageData )
matchedText = result.groups()[0]

撰写回答