首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我的regex不适用于BeautifulSoup?

为什么我的regex不适用于BeautifulSoup?
EN

Stack Overflow用户
提问于 2017-02-16 17:20:22
回答 4查看 174关注 0票数 0

我正在解析一个HTML文件,并希望匹配两个字符序列之间的所有内容:Sent:<br>标记。

我见过几个非常相似的问题,并尝试了他们的所有方法,但没有一个对我有用,可能是因为我是个新手,做一些非常简单的事情是错误的。

以下是我的相关代码:

代码语言:javascript
运行
复制
for filename in os.listdir(path): #capture email year, month, day
    file_path = os.path.join(path, filename)
    if os.path.isfile(file_path):
        with open(file_path, 'r') as f:
            html = f.read()
            soup = BeautifulSoup(html, 'html.parser')
            a = re.findall(r'Sent:/.+?(?=<br>)/', soup.text)[0]
            #a = re.findall(r'Sent:(.*)', soup.text)[0]
            print(a)
            d = parser.parse(a)
            print("year:", d.year)
            print("month:", d.month)
            print("day:", d.day)

我还为我的RegEx:a = re.findall(r'Sent:/^(.*?)<br>/', soup.text)[0]a = re.findall(r'Sent:/^[^<br>]*/', soup.text)[0]尝试了这些

但我一直有个错误list index out of range..。但是,即使当我删除[0]时,也会得到行d = parser.parse(a)上的错误AttributeError: 'list' object has no attribute 'read' .只打印[]作为print(a)的结果

下面是HTML的相关块:

代码语言:javascript
运行
复制
<b>Sent:</b> Friday, June 14, 2013 12:07 PM<br><b>To:</b> David Leveille<br><b>Subject:</b> 
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-02-16 18:29:19

问题不是真正的regex,而是BeautifulSoup解析HTML (毕竟是它的工作)并更改其内容的事实。例如,您的<br>将转换为<br/>。另一点: soup.text删除了所有的标记,这样你的正则表达式就不能再工作了。

更清楚的是,尝试这个脚本:

代码语言:javascript
运行
复制
from bs4 import *
import re
from dateutil import parser

pattern = re.compile(r'Sent:(.+?)(?=<br/>)')

with open("myfile.html", 'r') as f:
        html = f.read()
        print("html: ", html)
        soup = BeautifulSoup(html, 'lxml')
        print("soup.text: ", soup.text)
        print("str(soup): ", str(soup))
        a = pattern.findall(str(soup))[0]
        print("pattern extraction: ", a)

对于第二部分:由于日期字符串的形式不正确(因为初始的<br/>),您应该添加参数fuzzy=True,就像在日期文件l中解释的那样。

代码语言:javascript
运行
复制
d = parser.parse(a, fuzzy=True)
print("year:", d.year)
print("month:", d.month)
print("day:", d.day)

另一个解决方案是使用更精确的正则表达式。例如:

代码语言:javascript
运行
复制
pattern = re.compile(r'Sent:</b>(.+?)(?=<br/>)')
票数 1
EN

Stack Overflow用户

发布于 2017-02-16 17:30:06

请您将您的regex替换为下面查找关键条款以及它们之间的任何内容的正则表达式,并告诉我您现在收到的错误是什么?

代码语言:javascript
运行
复制
a=re.findall(r"Sent:(.*?)<br>", soup.text)[0]
票数 1
EN

Stack Overflow用户

发布于 2017-02-16 17:47:13

尝尝这个。它还考虑到如果<br>标记包含斜杠。

代码语言:javascript
运行
复制
/Sent:(.*?)<\/*br>/
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42280699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档