V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hanbaoo
V2EX  ›  程序员

要用正则表达式提取html文件所有的段落,就是<p>和</p>之间的,求解

  •  
  •   hanbaoo · 2012-01-11 21:43:41 +08:00 · 7213 次点击
    这是一个创建于 4491 天前的主题,其中的信息可能已经有所发展或是发生改变。
    28 条回复    1970-01-01 08:00:00 +08:00
    lhj2100
        1
    lhj2100  
       2012-01-11 21:58:06 +08:00
    不明白楼主的需求 用空格替换<p></p>不就可以了么..
    hanbaoo
        2
    hanbaoo  
    OP
       2012-01-11 22:01:12 +08:00
    那正则表达式怎么写呢?
    hanbaoo
        3
    hanbaoo  
    OP
       2012-01-11 22:01:28 +08:00
    @lhj2100 那正则表达式怎么写呢?
    qlqsh
        4
    qlqsh  
       2012-01-11 22:04:55 +08:00
    记不清了,好久没碰正则了,你找篇文章看下吧,特简单。10分钟基本就解决了。
    gfreezy
        5
    gfreezy  
       2012-01-11 22:07:53 +08:00
    不明白需求 +1
    如果只是把所有的 <p></p>直接的内容匹配出来

    regrex = r'<p>(.*?)</p>'
    paragraphs = re.findall(regrex, html_content)

    应该可以,没测试。
    fature
        6
    fature  
       2012-01-11 22:10:09 +08:00
    @gfreezy
    就是 随便一个网站 可以顺利截取 比如要 <p> </p>之间的数据
    但如果 里面的东西 分段了
    就截取不到
    gfreezy
        7
    gfreezy  
       2012-01-11 22:16:35 +08:00
    @fature beautifulsoup,xpath什么的可以处理这个。
    用js来抓 http://www.phantomjs.org/
    fature
        8
    fature  
       2012-01-11 22:28:04 +08:00
    @gfreezy 数据量大的时候效率太低了
    chuck911
        9
    chuck911  
       2012-01-11 22:39:16 +08:00
    pyquery/phpquery
    类jquery语法
    我抓取都用这种,懒得写正则
    gfreezy
        10
    gfreezy  
       2012-01-11 22:42:04 +08:00
    @fature beautifulsoup,xpath+lxml效率不低啊,况且一个页面,再大也没多少数据啊。
    phantomjs是直接用Qt的webkit内核,跟浏览器差不多,不会效率很差啊。
    evlos
        11
    evlos  
       2012-01-11 22:48:51 +08:00
    preg_match_all('/<p>(.*?)<\/p>/i',$data,$result); //PHP的,楼上已经有Python的了
    fature
        12
    fature  
       2012-01-11 22:53:42 +08:00
    @gfreezy 页面有几千个>_<
    lyxint
        13
    lyxint  
       2012-01-11 23:00:11 +08:00
    python的要加re.DOTALL这个flag, 不然会漏结果
    lyxint
        14
    lyxint  
       2012-01-11 23:03:03 +08:00
    用张教主的txt_wrap_by_all
    def txt_wrap_by(begin, end, html):
    if not html:
    return ''
    start = html.find(begin)
    if start >= 0:
    start += len(begin)
    end = html.find(end, start)
    if end >= 0:
    return html[start:end].strip()

    def txt_wrap_by_all(begin, end, html):
    if not html:
    return ''
    result = []
    from_pos = 0
    while True:
    start = html.find(begin, from_pos)
    if start >= 0:
    start += len(begin)
    endpos = html.find(end, start)
    if endpos >= 0:
    result.append(html[start:endpos].strip())
    from_pos = endpos+len(end)
    continue
    break
    return result

    ps = txt_wrap_by_all('<p>', '</p>', html)
    lyxint
        15
    lyxint  
       2012-01-11 23:04:52 +08:00
    <script src="https://gist.github.com/1595083.js"> </script>
    lyxint
        16
    lyxint  
       2012-01-11 23:05:14 +08:00
    lyxint
        17
    lyxint  
       2012-01-11 23:05:39 +08:00
    flyingkid
        18
    flyingkid  
       2012-01-11 23:07:45 +08:00
    @lyxint 把github的https去掉就可以了,带https抓不到。
    flyingkid
        19
    flyingkid  
       2012-01-11 23:08:15 +08:00
    gfreezy
        20
    gfreezy  
       2012-01-11 23:14:07 +08:00
    @fature 不多,曾经公司要爬新浪博客,爬了个把星期。。。--
    千把页面还好。。。
    hanbaoo
        21
    hanbaoo  
    OP
       2012-01-11 23:14:51 +08:00
    谢谢ls >_<
    ywjno
        22
    ywjno  
       2012-01-11 23:17:01 +08:00
    正则<p>(.*?)</p>的效率不低的
    fature
        23
    fature  
       2012-01-11 23:21:36 +08:00
    @flyingkid 辛苦了,这个跟正则表达式比起来效率可能低了点,我也想到过
    lyxint
        24
    lyxint  
       2012-01-12 00:03:46 +08:00
    @fature 字符串下标操作比re要慢??? 不可能的.

    让数据说话.

    http://gist.github.com/1595083.js?file=test.py

    http://gist.github.com/1595083.js?file=result
    lyxint
        25
    lyxint  
       2012-01-12 00:07:31 +08:00
    index.html是wget http://news.sina.com.cn/ 存到本地的
    kojp
        26
    kojp  
       2012-01-12 00:22:42 +08:00
    手机党伤不起 ........

    Php.的话 ,我经常加个 ius之类的多试几次 就能搞定

    Python的话 ,结合 beautiful soupv用 还不错 ....
    lyxint
        27
    lyxint  
       2012-01-12 00:31:55 +08:00
    @kojp 正则比单纯的字符串操作慢, beatifulsoup那就更慢了. beautifulsoup累死累活建了dom树, 你只取<p>和</p>之间的内容, 太浪费了.

    真想用什么库, 那就HTMLParser (beautifulsoup也用了), 很简单.
    fature
        28
    fature  
       2012-01-12 10:32:39 +08:00
    @lyxint 是一个朋友问我的,我对正则表达式不太熟,而且在做别的事,就在这里问了,我也给她建议过用html解析器,或者直接操作字符串处理,但是naive地以为正则表达式比较快(对正则的性能不太熟悉),我也都还没测试

    谢谢你啦
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1064 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 18:54 · PVG 02:54 · LAX 11:54 · JFK 14:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.