【问题标题】:How to write this in regular expression in Python?如何在 Python 中用正则表达式写这个?
【发布时间】:2013-04-24 05:18:12
【问题描述】:

我有一个大的 HTML 文件,我需要使用正则表达式从中解析一些数据。首先是餐厅的名称。酒店名称采用以下格式:

更新:

<html><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"></head><body><div class="businessresult clearfix">
        <div class="leftcol">
            <div id="bizTitle0" class="itemheading">
                <a href="https://courses.ischool.berkeley.edu/biz/capannina-san-francisco" id="bizTitleLink0">1.    Capannina
</a>
            </div>
                <div class="itemcategories">
                    Categories: <a href="https://courses.ischool.berkeley.edu/search?mapsize=small&amp;main_places=CA%3ASan_Francisco%3A%3ASOMA%2CCA%3ASan_Francisco%3A%3APacific_Heights%2CCA%3ASan_Francisco%3A%3AMission%2CCA%3ASan_Francisco%3A%3AHaight-Ashbury&amp;places=CA%3ASan_Francisco%3A%3A%5BSOMA%2CMission%2CMarina%2FCow_Hollow%5D&amp;rpp=40&amp;bbox=-122.471809387%2C37.7384127869%2C-122.368125916%2C37.8203616433&amp;attrs=&amp;sortby=category&amp;show_more_search_options=true&amp;cflt=italian&amp;find_loc=san+francisco%2C+ca" rel="italian" class="category" id="cat_result_0_italian">Italian</a>, <a href="https://courses.ischool.berkeley.edu/search?mapsize=small&amp;main_places=CA%3ASan_Francisco%3A%3ASOMA%2CCA%3ASan_Francisco%3A%3APacific_Heights%2CCA%3ASan_Francisco%3A%3AMission%2CCA%3ASan_Francisco%3A%3AHaight-Ashbury&amp;places=CA%3ASan_Francisco%3A%3A%5BSOMA%2CMission%2CMarina%2FCow_Hollow%5D&amp;rpp=40&amp;bbox=-122.471809387%2C37.7384127869%2C-122.368125916%2C37.8203616433&amp;attrs=&amp;sortby=category&amp;show_more_search_options=true&amp;cflt=seafood&amp;find_loc=san+francisco%2C+ca" rel="seafood" class="category" id="cat_result_0_seafood">Seafood</a>
                </div>
                <div class="itemneighborhoods">
                    Neighborhood: <a href="https://courses.ischool.berkeley.edu/search?find_desc=&amp;mapsize=small&amp;main_places=CA%3ASan_Francisco%3A%3ASOMA%2CCA%3ASan_Francisco%3A%3APacific_Heights%2CCA%3ASan_Francisco%3A%3AMission%2CCA%3ASan_Francisco%3A%3AHaight-Ashbury&amp;places=CA%3ASan_Francisco%3A%3A%5BSOMA%2CMission%2CMarina%2FCow_Hollow%5D&amp;attrs=&amp;sortby=category&amp;cflt=italian&amp;show_more_search_options=true&amp;parent_request_id=9536eaa25db61373&amp;find_loc=Marina%2FCow+Hollow%2C+San+Francisco%2C+CA" title="Marina/Cow Hollow, San Francisco, CA" class="location" id="hood_result_0_0">Marina/Cow Hollow</a>
                </div>
        </div>
        <div class="rightcol">
                <div class="rating"><img src="yelp_listings_files/stars_map.html" alt="4 star rating" title="4 star rating" class="stars_4 " height="325" width="83"></div> <a class="reviews" href="https://courses.ischool.berkeley.edu/biz/capannina-san-francisco">270 reviews</a>


            <address>
                1809 Union St<br>San Francisco, CA 94123<br>
                    </address><div class="phone">
                        (415) 409-8001
                    </div>


        </div>

总共有 40 家酒店。我认为. 后面有两个空格。我需要列出来自1 to 40 的所有酒店。我试过使用:

re.findall("[./0-9]", string_Name)

它输出数字。我想得到电话号码和所有酒店名称。我该怎么做?

Blender 的回答给出了评分和餐厅名单。没关系,但我想用不同的变量来评分和餐厅名称。

【问题讨论】:

    标签: regex python-3.x


    【解决方案1】:

    解析 HTML:

    import re
    from bs4 import BeautifulSoup
    
    html = '''
    <a href="https://courses.ischool.berkeley.edu/biz/capannina-san-francisco" id="bizTitleLink0">1.    Capannina
    </a>
    <a href="https://courses.ischool.berkeley.edu/biz/ristorante-parma-san-francisco" id="bizTitleLink4">5.     Ristorante Parma
    </a>
    '''
    
    soup = BeautifulSoup(html)
    
    for link in soup.find_all('a', text=re.compile(r'^\d')):
        print link.get_text()
    

    还有输出:

    1.    Capannina
    
    5.     Ristorante Parma
    

    【讨论】:

    • 没有名为 bs4 的模块:Python3?试过 sudo apt-get install python-bs4 和 sudo pip install beautifulsoup4。
    • @user2032220: pip 应该是pip3
    • 其实你的回答很有帮助。 BeautifulSoup 很棒,我安装了它。但是输出有点问题。我会更新这个问题。请查看我更新的问题。
    • 您的答案会打印出酒店名称和星级。我想要不同变量中的星级、酒店名称、电话号码和社区。​​span>
    • @user2032220:您可以使用关键字参数将搜索进一步细化为find_all。阅读文档以获取大量示例:crummy.com/software/BeautifulSoup/bs4/doc
    【解决方案2】:

    您不应该直接在 html 上运行正则表达式(最好先使用 HTML 解析器),但试试这个正则表达式:

    (\d+)\.\s+([^&lt;]+)

    一个或多个数字

    一个点

    一个或多个空格字符

    一个或多个非&lt; 字母

    括号 () 的存在创建了一个捕获组。捕获组 1 的内容将是数字。捕获组 2 的内容将是名称。

    【讨论】:

    • 如何指定这样的字符串:列出该字符串之后的所有内容?例如:列出 hello 之后的所有内容?
    • @user2032220 你的意思是像:hello(.*) 这样的正则表达式并获取捕获 1 的内容吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    相关资源
    最近更新 更多