我需要轻按一下才能完成此脚本。
我正在为一个特定的子字符串抓取新闻通讯网站。目的是解析名为提到的公司.. 的特定部分的页面,并将每个公司的名称转换为List数据类型
这是我到目前为止所能做的,但是可以得到第一项:
[Google, Apple, Tesla, Nike, TJX, Ross, L Brands, Dominoes]
所需结果:
我也可以改进我的正则表达式功能以捕获诸如“ here”之类的异常,例如“本期提到的公司:”或“提及的公司:”。 谢谢。
答案 0 :(得分:2)
您可以通过提供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']
答案 1 :(得分:2)
仅靠正则表达式无法完成您想实现的目标。捕获组只能捕获一件事,并且您无法动态捕获组。 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上的可运行示例