gpt4 book ai didi

python - 在我的爬虫中使用 lambda 函数时遇到问题

转载 作者:太空狗 更新时间:2023-10-29 21:06:30 24 4
gpt4 key购买 nike

我编写了一个脚本来解析 craigslist 中某些商品的名称和价格。我在我的爬虫中定义的 xpath 是有效的。问题是当我尝试以通常的方式抓取项目然后应用 try/except block 时,当特定价格的值为 none 时,我可以避免 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)

最佳答案

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

get_val = lambda item, path: item.xpath(path)[0].text if item.xpath(path) else ""

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

输出是这样的:

...
Residential Plot @ Sarjapur Check Post ₨1000
Prestige dolce vita apartments in whitefield, Bangalore
Brigade Golden Triangle, ₨12500000
Nikoo Homes, ₨6900000

但我认为您需要的是链接,而不是文本。如果是这种情况,请阅读下文。

好的,如何获取链接?当你有一个 anchor a 时,你会在属性表中得到它的 href(链接):a.attrib["href"] .

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

def get_val(item, path, l):
return l(item.xpath(path)[0]) if item.xpath(path) else ""

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

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

现在的输出是:

...
https://bangalore.craigslist.co.in/reb/d/residential-plot-sarjapur/6522786441.html ₨1000
https://bangalore.craigslist.co.in/reb/d/prestige-dolce-vita/6522754197.html
https://bangalore.craigslist.co.in/reb/d/brigade-golden-triangle/6522687904.html ₨12500000
https://bangalore.craigslist.co.in/reb/d/nikoo-homes/6522687772.html ₨6900000

关于python - 在我的爬虫中使用 lambda 函数时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49300628/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com