【问题标题】:Crawling IDs and getting TypeError: list indices must be integers or slices, not str抓取 ID 并获取 TypeError:列表索引必须是整数或切片,而不是 str
【发布时间】:2019-11-05 13:10:09
【问题描述】:

我尝试从房地产网站获取 ID。在我的第一次尝试中,我总是在一个建筑项目中获得第一个房地产。现在我尝试进一步深入 html-tree 以获取构建项目的其余部分。但是我收到了这个错误:

"TypeError: 列表索引必须是整数或切片,而不是 str"

HTML 看起来像这样:

 "resultlist.resultlist": {
                "paging": {
                    "next": {
                        "@xlink.href": "\/Suche\/S-T\/P-2\/Wohnung-Kauf\/Nordrhein-Westfalen\/Duesseldorf\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/true"
                    },
                    "current": {
                        "@xlink.href": "\/Suche\/S-T\/Wohnung-Kauf\/Nordrhein-Westfalen\/Duesseldorf\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/true"
                    },
                    "pageNumber": 1,
                    "pageSize": 20,
                    "numberOfPages": 3,
                    "numberOfHits": 140,
                    "numberOfListings": 50
                },
                "matchCountList": "",
                "resultlistEntries": [{
                    "@numberOfHits": "140",
                    "@realEstateType": "2",
                    "resultlistEntry": [{
                        "@id": "111337199",
                        "@modification": "2019-06-09T13:36:23.513+02:00",
                        "@creation": "2019-05-05T14:10:47.000+02:00",
                        "@publishDate": "2019-05-05T14:10:47.000+02:00",
                        "similarObjects": [{
                            "similarObject": [{
                                "@id": "105147583",
                                "@modification": "2019-05-05T10:37:59.830+02:00",
                                "@creation": "2018-05-30T11:44:29.000+02:00",
                                "@publishDate": "2018-05-30T11:44:29.000+02:00",
                                "realEstateId": 105147583,

我的第一次尝试是这样的:

page1 = ('https://www.immobilienscout24.de/Suche/S-1/Wohnung-Kauf/Nordrhein-Westfalen/Duesseldorf/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/true')
res_page1 = requests.get(page1)
soup_page1 = bs(res_page1.content, 'lxml')
r_page1 = re.compile(r'resultListModel:(.*)')
data_page1 = soup_page1.find('script', text=r_page1).text
script_page1 = r_page1.findall(data_page1)[0].rstrip(',')
results_page1 = json.loads(script_page1)
ids_page1 = [item["@id"] for item in results_page1['searchResponseModel']['resultlist.resultlist']['resultlistEntries'][0]['resultlistEntry']]

得到这个输出:

['111353960', '110253440', '111994208', '110517626', '109984070', '109855231', '108761945', '108639776', '106997219', '106492496', '111604737', '111357085', '92741038', '112031279', '111988597', '111876292', '111870285', '111798416', '110742328', '110742299']

现在我去拿剩下的也是这样的:

ids_page1 = [item["@id"] for item in results_page1['searchResponseModel']['resultlist.resultlist']['resultlistEntries']['resultlistEntry']['similarObjects'][0]['similarObject']]

现在我得到了类型错误。

请有人解释一下我做错了什么。

【问题讨论】:

  • 对于 ID 为 109793951 返回的第一个项目,预期的其他 ID/ID 是什么?
  • 不,那太多了,我只需要一个包含所有这些的列表。如果我像第一次尝试那样做并获得顶级 id,然后在第二次运行中类似的对象 id 也很好。我只需要他们所有人在第二步中使用 ID 构建 URL。

标签: python string list beautifulsoup typeerror


【解决方案1】:

在输出中,您会看到一个字符串列表。请注意围绕这些值的'。 在一串数字上调用 int(s) 将其转换为数字。

【讨论】:

  • 好的,谢谢,两个问题:首先我必须将 int() 放在哪里。第二,我在做什么与第一次尝试没有错误的地方不同?对我来说,似乎我只是以与以前相同的逻辑顺着 html 树向下,但现在出现错误并且必须转换值。
【解决方案2】:

尝试以下通过关卡的方法

from bs4 import BeautifulSoup as bs #4.7.1
import requests

page1 = 'https://www.immobilienscout24.de/Suche/S-1/Wohnung-Kauf/Nordrhein-Westfalen/Duesseldorf/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/true'
res_page1 = requests.get(page1)
soup_page1 = bs(res_page1.content, 'lxml')
r_page1 = re.compile(r'resultListModel:(.*)')
data_page1 = soup_page1.find('script', text=r_page1).text
script_page1 = r_page1.findall(data_page1)[0].rstrip(',')
results_page1 = json.loads(script_page1)
ids = []

for item in results_page1['searchResponseModel']['resultlist.resultlist']['resultlistEntries'][0]['resultlistEntry']:
    ids.append(item['@id'])
    if 'similarObjects' in item:
        for i in item['similarObjects'][0]['similarObject']:
            if isinstance(i,dict):
                ids.append(i['@id'])
            elif i == '@id':
                ids.append(item['similarObjects'][0]['similarObject'][i])

【讨论】:

  • 嘿,我想我在示例中放错了链接,那是正确的:“immobilienscout24.de/Suche/S-1/Wohnung-Kauf/Nordrhein-Westfalen/…”在第一次尝试中,我只是获得了每个项目的第一个房地产。在第二个中,我想获得每个项目的所有其他房地产。在你的解决方案中,我得到了周围的郊区。
  • 您能否提供一个您希望返回的其他 ID 的示例?
  • 从上面的 HTML 示例中,我第一次尝试只是:这个 ID 111337199。但我也想得到这个“105147583”。
猜你喜欢
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多