【问题标题】:Can't isolate desired results out of crude ones无法从粗略的结果中分离出期望的结果
【发布时间】:2019-07-15 20:27:04
【问题描述】:

我在 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 等等。

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

【问题讨论】:

  • 所以你想要NY:New_York:Bronx:Edenwald而不是NY:New_York:Staten_Island:Lighthouse_Hill
  • 我希望一切都以NY:New_York:开始

标签: python python-3.x web-scraping


【解决方案1】:

我不确定您的完整数据集是什么样的,但根据您的样本, 你可能会使用类似的东西:

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]

如果这对你想要实现的目标不起作用,那么你可以只使用一个变量来表示状态。

【讨论】:

  • 当我遵从你的建议时,我也会得到这种类型的结果g:-73.997490406,40.7030089925,-73.9910960197,40.7078889327
  • 上面的第二个选项不会产生少于 3 个 ':' 的结果。
  • 是的,您的第二个解决方案是 @Amir Almusawi 的诀窍。谢谢。
【解决方案2】:

下面是另一个解决方案 - 使用 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 中提取 NYC 信息的乐趣......

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('---------------')

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

曼哈顿

['NY:New_York:Manhattan:Alphabet_City', 'NY:New_York:Manhattan:Battery_Park', 'NY:New_York:Manhattan:Central_Park', 'NY:New_York:Manhattan:Chelsea', '...]

等等

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-13
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多