Python 正则匹配跨行 HTML 的办法

2017-01-19 19:00:50 +08:00
 pinkman

除了[\s\S]外,还有其它办法能匹配“跨行”的内容吗?问题比较烂,我用个简单例子来说明下:

如下这段 HTML ,我要匹配出 Text 的内容,因为中间还插着很多其它内容,所以我不能简单的<p>(.*?)<\/p>做匹配,必需从某个父节点找下去,才能精确定义,从父节点下去就涉及到“跨行”了

<p class="anchor">

<a href="#">Link</a>

<img src="/img/cover.jpg"><p>Text</p>

我目前知道的办法是,但听说这样效率不好,内容多了容易“卡”住,因为[\s\S],除此之外还有其它办法达到我期望的效果吗?感谢🙏

anchor">[\s\S]+.*?p>(.*?)<\/p>
3095 次点击
所在节点    Python
8 条回复
soratadori
2017-01-19 19:19:41 +08:00
re.search("<p.*p>", text, re.S)
lightning1141
2017-01-19 19:22:35 +08:00
用 lxml 之类的库,尽量不要用正则
多行匹配加参数 re.DOTALL
chroming
2017-01-19 19:27:32 +08:00
跨行一般是用 re.S 的
pinkman
2017-01-19 19:39:00 +08:00
谢谢三位, re.S 果然可行。

@lightning1141 嗯,我知道有几个 HTML 解析的库可用,我直接写正则会不会效率更高一些呢?
IanPeverell
2017-01-19 19:59:15 +08:00
我觉得用 lxml 配合 XPath 好一点,可读性和可维护性要比直接正则好一点
seki
2017-01-19 20:20:36 +08:00
用 xml parser 会更好一点,因为 html 本身不是正则的语言
imn1
2017-01-19 20:32:10 +08:00
运行效率 regex 高,开发效率 dom 高
billlee
2017-01-19 21:28:08 +08:00
HTML 不是正则语言
如果你担心 DOM 的效率有问题,可以用 SAX

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/335684

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX