在我的刮刀中使用lambda函数时遇到麻烦

SIM*_*SIM 8 python lambda web-scraping python-3.x

我写了一个脚本来解析craigslist中某些项目的名称和价格.在xpath我的刮板内定义[我已正在努力的.事情是,当我尝试以通常的方式刮取物品然后应用try/except块我可以避免IndexError当某个价格的值为零时.我甚至尝试使用自定义功能使其工作并获得成功.

但是,在下面的代码片段中,我想应用lambda函数来解决IndexError错误.我试过但不能成功.

顺便说一句,当我运行代码它既不取任何东西也不抛出任何错误.

import requests
from lxml.html import fromstring

page = requests.get('http://bangalore.craigslist.co.in/search/rea?s=120').text
tree = fromstring(page)

# I wish to fix this function to make a go
get_val = lambda item,path:item.text if item.xpath(path) else ""

for item in tree.xpath('//li[@class="result-row"]'):
    link = get_val(item,'.//a[contains(@class,"hdrlnk")]')
    price = get_val(item,'.//span[@class="result-price"]')
    print(link,price)
Run Code Online (Sandbox Code Playgroud)

jfe*_*ard 4

首先,get_val如果路径存在,您的 lambda 函数将返回项目的文本,而不是搜索节点的文本。这可能不是您想要的。如果想返回与路径匹配的(第一个)元素的文本内容,您应该编写:

\n\n
get_val = lambda item, path: item.xpath(path)[0].text if item.xpath(path) else ""\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,xpath返回一个列表。我假设该列表中只有一个元素。

\n\n

输出是这样的:

\n\n
...\nResidential Plot @ Sarjapur Check Post \xe2\x82\xa81000\nPrestige dolce vita apartments in whitefield, Bangalore \nBrigade Golden Triangle, \xe2\x82\xa812500000\nNikoo Homes, \xe2\x82\xa86900000\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我认为你想要一个链接,而不是文本。如果是这种情况,请阅读下文。

\n\n

好吧,如何获取链接?当您有一个锚点时a,您可以href在属性表中获得它(链接)a.attrib["href"]:。

\n\n

据我了解,在价格的情况下,您需要文本,但在锚点的情况下,您需要一个特定属性 href 的值。这是 lambda 的真正用途。像这样重写你的函数:

\n\n
def get_val(item, path, l):\n    return l(item.xpath(path)[0]) if item.xpath(path) else ""\n
Run Code Online (Sandbox Code Playgroud)\n\n

参数l是应用于节点的函数。l可以返回节点的文本,或锚点的 href:

\n\n
link = get_val(item,\'.//a[contains(@class,"hdrlnk")]\', lambda n: n.attrib["href"])\nprice = get_val(item,\'.//span[@class="result-price"]\', lambda n: n.text)\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在输出是:

\n\n
...\nhttps://bangalore.craigslist.co.in/reb/d/residential-plot-sarjapur/6522786441.html \xe2\x82\xa81000\nhttps://bangalore.craigslist.co.in/reb/d/prestige-dolce-vita/6522754197.html \nhttps://bangalore.craigslist.co.in/reb/d/brigade-golden-triangle/6522687904.html \xe2\x82\xa812500000\nhttps://bangalore.craigslist.co.in/reb/d/nikoo-homes/6522687772.html \xe2\x82\xa86900000\n
Run Code Online (Sandbox Code Playgroud)\n