【问题标题】:Regular Expression HTML Tag Exclusion正则表达式 HTML 标记排除
【发布时间】:2012-01-26 19:12:31
【问题描述】:

是的,是的,我权衡了使用 xml 解析器而不是正则表达式,但这似乎是一个足够简单的情况,它是合适的:

from BeautifulSoup import BeautifulSoup
from urllib import urlopen

tempSite = 'http://www.sumkindawebsiterighthur.com'
theTempSite = urlopen(tempSite).read()
currentTempSite = BeautifulSoup(theTempSite)
Email = currentTempSite.findAll('tr', valign="top") 
print Email[0] 

目前结果:

<tr valign="top">
<td><p>Phone Number:</p></td>
<td>&nbsp;</td>
<td><p>706-878-8888</p></td>
</tr>

我正在尝试删除所有标记(tr、td、p、 也会很好)和结果:

Phone Number: 706-878-8888

我的问题是过度排除和多行正则表达式,寻找在单行上输出的答案。

【问题讨论】:

  • 如果您已经拥有一个带有 BeautifulSoup 的 DOM,则不需要 XML 解析器。当然,您可以递归地遍历子节点并连接每个子节点的内部文本吗? (我从没用过 BeautifulSoup)
  • 我得到一个空列表 (Email = []),这是正确的 URL 吗?
  • 哈哈不,不是正确的站点。将某人的信息保密。不过,必须有一个简单的解决方案。
  • 为@Cameron +1。不要为此使用正则表达式,使用 BeautifulSoup 进一步尝试,你会得到更好的结果,并学习“正确的方法”来做这类事情。

标签: python html regex beautifulsoup


【解决方案1】:

如果您的结果真的总是那么简单,只要设置了re.DOTALL 标志,以下正则表达式会将“电话号码:”放入捕获组 1 和捕获组 2 中:

.*(Phone Number:).*?([-\d]+).*

然后您可以使用替换 \1 \2 在您的字符串上调用 re.sub()

这是一个完整的例子,可以返回你想要的:

>>> s = """<tr valign="top">
... <td><p>Phone Number:</p></td>
... <td>&nbsp;</td>
... <td><p>706-878-8888</p></td>
... </tr>"""
>>> regex = re.compile(r'.*(Phone Number:).*?([-\d]+).*', re.DOTALL)
>>> regex.sub(r'\1 \2', s)
'Phone Number: 706-878-8888'

【讨论】:

    猜你喜欢
    • 2017-01-20
    • 1970-01-01
    • 2014-05-13
    • 2014-04-11
    • 2018-06-22
    • 2014-04-11
    • 2014-01-29
    • 2012-02-22
    • 2011-05-03
    相关资源
    最近更新 更多