房地产清单刮板:如何从列表标题中提取卧室#?

时间:2015-09-13 06:39:32

标签: python scraper

Python noob在这里所以请随意假设我什么都不知道。

所以我正在建立这个网络刮板来浏览某个网站上的房地产列表,从一堆页面下载它们(每个页面是一个不同的社区),并从列表标题中提取卧室的价格和数量最终将所有这些内容放入一张易于我玩的Excel表格中。

除了卧室数以外,我已经完成了所有这些工作。大多数列表使用少数几种格式之一来传达房间数量。例如,如果列表是针对单卧室公寓的,则您会在列表文本中看到以下字符串之一:

  • 1br
  • 1 / one br
  • 1 /一间卧室

够容易。所以我想要脚本的这一部分,“列表标题是否包含其中一个字符串?如果是,它是一间卧室的公寓。如果没有,检查它是否是两居室公寓。如果没有,检查是否这是一间三居室的公寓。如果不是这些,只要回一个悲伤的脸。“

我将标题文本与卧室数量保持在一起的方法是制作字典,其中键是标题文本,值是卧室计数。这本词典叫做bedDict。

以下是我到目前为止所尝试的内容。奇怪的是,SEEMS工作,但经过实际检查,我发现有很多结果不匹配。标题是“美丽的80平方米公寓2 br靠近地铁!”例如,我会在电子表格的“卧室计数”栏中说“1 br”。

列表'goodLinks'包含我从分类广告网站上删除的所有标题。

bedrooms = []
oneBrPat = ['1br', '1 br', '1 bedroom', 'one br', 'one bedroom']
twoBrPat = ['2br', '2 br', '2 bedroom', 'two br', 'two bedroom']
threeBrPat = ['3br', '3 br', '3 bedroom', 'three br', 'three bedroom']

print("Creating bedroom dictionary")
bedDict = {}
for b in goodLinks:
    bedDict[b] = ":("
#Setting the "values" to "sadface" and then replacing them with bedroom count after a match is found.
print("Beginning bedroom count")
for a in goodLinks:
    if a is not None:
    for b in oneBrPat:
        print(b)
        if str(b) in str(a):
            print (str(b))
            bedDict[a] = "1 br"
for a in goodLinks:
    if a is not None:
    for b in twoBrPat:
        print(b)
        if str(b) in str(a):
            print (str(b))
            bedDict[a] = "2 br"
for a in goodLinks:
    if a is not None:
    for b in threeBrPat:
        print(b)
        if str(b) in str(a):
            print (str(b))
            bedDict[a] = "3 br"
print("Ending bedroom count")

bedCount = bedDict.values()

接下来的想法是“bedCount”将按顺序排列为卧室数量,这些卧室将与价格和列表标题一起放入Excel表格中。唯一的问题是Excel工作表中的结果与实际的帖子标题不匹配。怎么了?

如果有必要,我可以显示更多代码,但目前整个内容是172行。

1 个答案:

答案 0 :(得分:0)

我建议您使用正则表达式来表示这样的内容,因为它可以设计为满足输入列表中的更多变化,例如单词之间的其他空格。

以下内容可以帮助您入门:

import re

tests = [
    "No bedrooms here",
    "Beautiful 80sqm apartment 1 br close to the subway!",
    "Beautiful 80sqm apartment one   br close to the subway!",
    "Beautiful 80sqm apartment 1  bedroom close to the subway!",
    "Beautiful 80sqm apartment TWO br close to the subway!",
    "Beautiful 80sqm apartment 2 bedrooms close to the subway!",
    "Beautiful 80sqm apartment 3 br close to the subway!",
    "Beautiful 80sqm apartment fOur br close to the subway!"]

d_numbers = {'one' : 1, 'two' : 2, 'three' : 3, 'four' : 4}

for test in tests:
    re_count = re.search("\s(\d|one|two|three|four)\s*?(?:br|bedroom|bedrooms)\s", test, re.I)

    if re_count:
        bedrooms_text = re_count.group(1).lower()

        try:
            bedrooms = int(bedrooms_text)
        except ValueError:
            bedrooms = d_numbers[bedrooms_text]

        print "Bedrooms:", bedrooms
    else:
        bedrooms = ':-('

    print "Bedrooms:", bedrooms

这会给你以下结果:

Bedrooms: :-(
Bedrooms: 1
Bedrooms: 1
Bedrooms: 1
Bedrooms: 1
Bedrooms: 1
Bedrooms: 1
Bedrooms: 2
Bedrooms: 2
Bedrooms: 2
Bedrooms: 2
Bedrooms: 3
Bedrooms: 3
Bedrooms: 4
Bedrooms: 4

可能需要根据您的完整数据集进一步增强。