【问题标题】:HTML parsing with python regular expression使用 python 正则表达式解析 HTML
【发布时间】:2016-07-11 19:48:03
【问题描述】:

我正在使用python正则表达式来解析html文件,现在我需要从html标签中提取一个数字,这个数字可以是整数或浮点值。以下是两个例子:

整数大小写:

<span class='addr-bbs'>2 baths</span>

浮点数情况:

<span class='addr-bbs'>3.5 baths</span>

我原来的代码是:

bath = re.findall('<span class=\"addr_bbs\">' + '(.{1,3})' + 'baths{0,1}<', str(homedata))

但经过测试,它错过了所有的浮点情况。如何涵盖这两种情况以正确提取数字?

谢谢

【问题讨论】:

标签: python html regex


【解决方案1】:

正如评论,使用html parser类名 查找标签。如果数字始终是文本中的第一个,则可以在拥有标签后拆分以提取它:

from bs4 import BeautifulSoup
h = """<span class='addr-bbs'>3.5 baths</span>
      <span class='addr-bbs'>1 baths</span>
      <span class='foos'>3.0 baths</span>"""

soup = BeautifulSoup(h,"html.parser")

for span in soup.select("span.addr-bbs"):
    print(span.text.split()[0])

哪个会打印:

3.5
1

如果您还想通过标签文本进行过滤,即addr-bbs 有其他跨度,您可以将正则表达式传递给find_all 以仅获取 span.addr-bbs这个词。

from bs4 import BeautifulSoup
import re
h = """<span class='addr-bbs'>3.5 baths</span>
"<span class='addr-bbs'>5 rooms</span>
      <span class='addr-bbs'>1 baths</span>
      <span class='foos'>3.0 baths</span>"""

soup = BeautifulSoup(h, "html.parser")

for span in soup.find_all("span","addr-bbs", text=re.compile(r"\bbaths\b")):
    print(span.text.split()[0])

【讨论】:

  • 您可能是对的,从长远来看,regx 可能不是一个好主意。我需要用 BeautifulSoup 重做整个事情。
【解决方案2】:

首先,意识到如果没有更多的处理,你就注定要失败。有些房地产经纪人会写“2.5”,有些会写“2 1/2”,有些会写“2+1/2”,等等。大联盟 数据从未标准化,部分原因是难以解析。就在您认为已解决时,您会得到“2+sink”。通常允许猜测搜索的数字含义,然后在显示时吐出原始文本。

您可能应该获取从&gt;baths 的所有内容。要正确执行此操作,您应该使用“非贪婪”修改,这样您就不会解析 一直到下一个记录。你可以在 thsi Python doc 中阅读 non-greedy,但神奇的短语是:

bath = re.findall('&lt;span class=\"addr_bbs\"&gt;(.*?)bath.?&lt;', str(homedata))

然后尽量解析 bath.groups() 。

【讨论】:

    【解决方案3】:

    三个错别字:

    • 引号;
    • 破折号;
    • 空间。

    试试bath = re.findall('''&lt;span class=["']addr-bbs["']&gt;''' + '(.{1,3})' + ' baths{0,1}&lt;', str(homedata))

    【讨论】:

      猜你喜欢
      • 2014-06-26
      • 2012-09-12
      • 2014-06-08
      • 2014-05-16
      • 1970-01-01
      • 2016-05-01
      • 2010-09-08
      相关资源
      最近更新 更多