使用正则表达式从HTML提取所有值

时间:2019-01-11 03:17:39

标签: python regex web-scraping beautifulsoup

我需要轻按一下才能完成此脚本。

我正在为一个特定的子字符串抓取新闻通讯网站。目的是解析名为提到的公司.. 的特定部分的页面,并将每个公司的名称转换为List数据类型

这是我到目前为止所能做的,但是可以得到第一项:

[Google, Apple, Tesla, Nike, TJX, Ross, L Brands, Dominoes]

所需结果:

  • 我想将个提到的公司放入这样的列表中: {{1}}

我也可以改进我的正则表达式功能以捕获诸如“ here”之类的异常,例如“本期提到的公司:”或“提及的公司:”。 谢谢。

2 个答案:

答案 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上的可运行示例