代码之家  ›  专栏  ›  技术社区  ›  ezeagwulae

使用regex从HTML中提取所有值

  •  3
  • ezeagwulae  · 技术社区  · 6 年前

    我需要一个小动作来完成这个剧本。

    我正在为一个特定的子字符串搜索时事通讯网站。其目的是为一个称为 提到的公司…… 并将每个公司的名称放入列表数据类型中

    以下是目前为止我所拥有的,它有效,但只得到第一项:

    from bs4 import BeautifulSoup as bs4
    import requests
    import re
    
    url = 'http://news.hipsternomics.com/issues/how-much-is-your-personal-data-worth-on-the-black-market-148489'
    r = requests.get(url).text
    soup = bs4(r, 'html.parser')
    companies = []
    for elem in soup(text=re.compile(r'^(.*?Companies mentioned\b)')):
        companies.append(elem)    
    

    预期结果:

    • 我想得到 提及的公司 列表如下: [Google, Apple, Tesla, Nike, TJX, Ross, L Brands, Dominoes]

    另外,我还可以采用一些方法来改进regex函数,以捕获“本问题中提到的公司”或“所提到的公司”等异常情况。 here . 谢谢。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Ajax1234    6 年前

    您可以通过提供 div 班级价值:

    import requests, re
    from bs4 import BeautifulSoup as soup
    d = soup(requests.get('http://news.hipsternomics.com/issues/how-much-is-your-personal-data-worth-on-the-black-market-148489').text, 'html.parser')
    new_d = [i for i in d.find_all('div', {'class':'revue-p'}) if 'Companies mentioned' in i.text][0]
    *final_results, _ = [re.sub('^[\w\s]+[,\s:]+|^[,\s]+|\s+$', '', i) for i in new_d.contents if isinstance(i, str)]
    

    输出:

    ['Google', 'Apple', 'Tesla', 'Nike', 'TJX', 'Ross', 'L Brands', 'Domino’s']
    
        2
  •  2
  •   Hanxue    6 年前

    你想要达到的目标不能只靠regex来完成。一个捕获组只能捕获一件事,而您无法动态捕获组。 This article has further explanation .

    我要做的是首先得到所有公司的名单

    all_companies = re.search(r'Companies mentioned YTD:\s(.*)', orig_text).group(1)
    print(all_companies, '\n')
    

    接下来,将字符串拆分为 ,

    companies_percent = all_companies.split(', ')
    
    # print(companies_percent, '\n')
    # Output
    # ['Google -1%', 'Apple 0%', 'Tesla +15%', 'Nike +17%', 'TJX +18%', 'Ross -2%', 'L Brands -47%', 'Domino’s +37%'] 
    

    最后去掉公司名称后面的百分比

    companies = list(map(lambda x: re.search(r'(.*)\s[\+|-]?\d+%', x).group(1), companies_percent))
    
    # print(companies, '\n')
    # Output
    # ['Google', 'Apple', 'Tesla', 'Nike', 'TJX', 'Ross', 'L Brands', 'Domino’s'] 
    

    把它们放在一起:

    import re
    from bs4 import BeautifulSoup as bs4
    import requests
    
    url = 'http://news.hipsternomics.com/issues/how-much-is-your-personal-data-worth-on-the-black-market-148489'
    r = requests.get(url).text
    soup = bs4(r, 'html.parser')
    
    all_companies = re.search(r'Companies mentioned YTD:\s(.*)', soup.get_text()).group(1)
    companies_percent = all_companies.split(', ')
    companies = list(map(lambda x: re.search(r'(.*)\s[\+|-]?\d+%', x).group(1), companies_percent))
    

    可运行的示例 https://repl.it/@hanxue/capturingrepeatedtextgrouppython