• 请不要在回答技术问题时复制粘贴 AI 生成的内容
hanbaoo
V2EX  ›  程序员

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

  •  
  •   hanbaoo · Jan 11, 2012 · 8511 views
    This topic created in 5412 days ago, the information mentioned may be changed or developed.
    28 replies  •  1970-01-01 08:00:00 +08:00
    lhj2100
    lhj2100
    Jan 11, 2012
    1
    不明白楼主的需求 用空格替换<p></p>不就可以了么..
    hanbaoo
    hanbaoo
    OP
    Jan 11, 2012
    2
    那正则表达式怎么写呢?
    hanbaoo
    hanbaoo
    OP
    Jan 11, 2012
    3
    @lhj2100 那正则表达式怎么写呢?
    qlqsh
    qlqsh
    Jan 11, 2012
    4
    记不清了,好久没碰正则了,你找篇文章看下吧,特简单。10分钟基本就解决了。
    gfreezy
    gfreezy
    Jan 11, 2012
    5
    不明白需求 +1
    如果只是把所有的 <p></p>直接的内容匹配出来

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

    应该可以,没测试。
    fature
    fature
    Jan 11, 2012
    6
    @gfreezy
    就是 随便一个网站 可以顺利截取 比如要 <p> </p>之间的数据
    但如果 里面的东西 分段了
    就截取不到
    gfreezy
    gfreezy
    Jan 11, 2012
    7
    @fature beautifulsoup,xpath什么的可以处理这个。
    用js来抓 http://www.phantomjs.org/
    fature
    fature
    Jan 11, 2012
    8
    @gfreezy 数据量大的时候效率太低了
    chuck911
    chuck911
    Jan 11, 2012
    9
    pyquery/phpquery
    类jquery语法
    我抓取都用这种,懒得写正则
    gfreezy
    gfreezy
    Jan 11, 2012
    10
    @fature beautifulsoup,xpath+lxml效率不低啊,况且一个页面,再大也没多少数据啊。
    phantomjs是直接用Qt的webkit内核,跟浏览器差不多,不会效率很差啊。
    evlos
    evlos
    Jan 11, 2012
    11
    preg_match_all('/<p>(.*?)<\/p>/i',$data,$result); //PHP的,楼上已经有Python的了
    fature
    fature
    Jan 11, 2012
    12
    @gfreezy 页面有几千个>_<
    lyxint
    lyxint
    Jan 11, 2012
    13
    python的要加re.DOTALL这个flag, 不然会漏结果
    lyxint
    lyxint
    Jan 11, 2012
    14
    用张教主的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
    lyxint
    Jan 11, 2012
    15
    <script src="https://gist.github.com/1595083.js"> </script>
    lyxint
    lyxint
    Jan 11, 2012
    17
    flyingkid
    flyingkid
    Jan 11, 2012
    18
    @lyxint 把github的https去掉就可以了,带https抓不到。
    flyingkid
    flyingkid
    Jan 11, 2012
    19
    gfreezy
    gfreezy
    Jan 11, 2012
    20
    @fature 不多,曾经公司要爬新浪博客,爬了个把星期。。。--
    千把页面还好。。。
    hanbaoo
    hanbaoo
    OP
    Jan 11, 2012
    21
    谢谢ls >_<
    ywjno
    ywjno
    Jan 11, 2012
    22
    正则<p>(.*?)</p>的效率不低的
    fature
    fature
    Jan 11, 2012
    23
    @flyingkid 辛苦了,这个跟正则表达式比起来效率可能低了点,我也想到过
    lyxint
    lyxint
    Jan 12, 2012
    24
    @fature 字符串下标操作比re要慢??? 不可能的.

    让数据说话.

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

    http://gist.github.com/1595083.js?file=result
    lyxint
    lyxint
    Jan 12, 2012
    25
    index.html是wget http://news.sina.com.cn/ 存到本地的
    kojp
    kojp
    Jan 12, 2012
    26
    手机党伤不起 ........

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

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

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

    谢谢你啦
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5136 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 06:34 · PVG 14:34 · LAX 22:34 · JFK 01:34
    ♥ Do have faith in what you're doing.