所以我一直在研究一个网络爬虫来解析我喜欢的新闻网站上的可读内容,而且我一直在python2中使用正则表达式。我访问https://regexr.com/以仔细检查我是否有这个用例的正确表达式,但我得到的结果与预期不同,特别是当我交叉引用regexr的输出时。这是表达式
re.compile(ur"[\s\S\]*<p.*>([\s\S]+?)<\/p>")
这是我试图匹配的HTML
</figcaption></figure><p>Researchers at MIT and several other
institutions have developed a method for making photonic ...
它最终没有关闭一段时间,但该程序根本没有抓住这一部分,只有在进入
之后ygen levels</a>, and even blood pressure.</p>
是否开始抓取html(编辑:p元素)。我想我对不同的正则表达式引擎的不一致感到困惑,我试图找出修改我的语法的时间和地点,在这种情况下,抓住整个p元素,但也一般。这是我第一次在这里发帖,所以我的格式可能不正确,但提前谢谢大家。已经潜伏了一段时间。
答案 0 :(得分:0)
也许是因为你的正则表达式中没有右括号?
尝试从此开始,然后构建它:
import re
s = """</figcaption></figure><p>Researchers at MIT and several other
institutions have developed a method for making photonic</p>"""
r = re.compile(r"<p>([\w\W ]*)</p>")
a = r.search(s)
print(a.group(1))
请注意,您不必转义正斜杠。
答案 1 :(得分:0)
表达式[\ s \ S] *将匹配所有内容,因此将直接超过标记的开头。
在标签内,表达式p。*是贪婪的,不会停在最近的结束括号。使用 。*?非贪婪。
你似乎还在正则表达式中有许多其他语法错误。剪切并粘贴有效的正则表达式。
一般来说,即使对于非常简单的任务,使用适当的HTML解析库也更容易且更不容易出错。例如,参见lxml中的解析器。
答案 2 :(得分:0)
在这种情况下,我最终获得了我想要的响应,将@marekful的表达式替换为帖子中提到的正则表达式。谢谢大家的帮助!
re.compile(ur"[\s\S\]*?<p[^>]*>([\w\W])*</\p>")