无法将所需的结果与粗略的结果隔离开来



我在python中创建了一个脚本,用于从网页中获取邻居的名称。我已经使用requests库和re模块来解析该站点中某些脚本标记中的内容。当我运行脚本时,我以正确的方式获取邻居的名称。但是,问题是我已经使用这一行if not item.startswith("NY:"):continue来摆脱该页面中不需要的结果。我不希望使用这个硬编码部分NY:来做这个技巧。

  • 网站链接

我试过:

import re
import json
import requests
link = 'https://www.yelp.com/search?find_desc=Restaurants&find_loc=New%20York%2C%20NY&start=1'
resp = requests.get(link,headers={"User-Agent":"Mozilla/5.0"})
data = json.loads(re.findall(r'data-hypernova-key[^{]+(.*)--></script>',resp.text)[0])
items = data['searchPageProps']['filterPanelProps']['filterInfoMap']
for item in items:
    if not item.startswith("NY:"):continue
    print(item)

我得到的结果(期望的结果(:

NY:New_York:Brooklyn:Mill_Basin
NY:New_York:Bronx:Edenwald
NY:New_York:Staten_Island:Stapleton

如果我if not item.startswith("NY:"):continue不使用这一行,结果是这样的:

rating
NY:New_York:Brooklyn:Mill_Basin
NY:New_York:Bronx:Edenwald
NY:New_York:Staten_Island:Stapleton
NY:New_York:Staten_Island:Lighthouse_Hill
NY:New_York:Queens:Rochdale
NY:New_York:Queens:Pomonok
BusinessParking.validated
food_court
NY:New_York:Queens:Little_Neck

底线是我希望一切都从NY:New_York:开始。我所说的不需要的结果是指ratingBusinessParking.validatedfood_court等等。

如何在脚本中不使用任何硬编码的搜索部分来获取邻居?

我不确定您的完整数据集是什么样子的,但根据您的样本,您可以使用类似以下内容:

if ':' not in item:
    continue
# or perhaps:
if item.count(':') < 3:
    continue
# I'd prefer a list comprehension if I didn't need the other data 
items = [x for x in data['searchPageProps']['filterPanelProps']['filterInfoMap'] if ':' in x]

如果这对您要实现的目标不起作用,那么您可以只使用状态变量。

另一种解决方案——使用 BeautifulSoup ——不涉及正则表达式或硬编码"NY:New_York"如下; 它很复杂,但主要是因为Yelp将它的宝藏埋在了几层深的地方......

所以供将来参考:

from bs4 import BeautifulSoup as bs
import json
import requests
link = 'https://www.yelp.com/search?find_desc=Restaurants&find_loc=New%20York%2C%20NY&start=1'
resp = requests.get(link,headers={"User-Agent":"Mozilla/5.0"})
target = soup.find_all('script')[14]
content = target.text.replace('<!--','').replace('-->','')
js_data = json.loads(content)

现在,从 json 中提取纽约市信息的乐趣开始了......

for a in js_data:
  if a == 'searchPageProps':
    level1 = js_data[a]
    for b in  level1:
        if b == 'filterPanelProps':
            level2 = level1[b]
            for c in level2:                    
                if c == 'filterSets':
                    level3 = level2[c][1]
                    for d in level3:
                        if d == 'moreFilters':
                            level4 = level3[d]
                            for e in range(len(level4)):   
                                print(level4[e]['title'])
                                print(level4[e]['sectionFilters'])
                                print('---------------')

输出是每个行政区的名称以及该行政区中所有社区的列表。例如:

曼哈顿

['纽约:New_York:曼哈顿:Alphabet_City',"纽约:New_York:曼哈顿:Battery_Park","纽约:New_York:曼哈顿:Central_Park", "纽约:New_York:曼哈顿:切尔西",'...]

等。

最新更新