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)
首先,get_val如果路径存在,您的 lambda 函数将返回项目的文本,而不是搜索节点的文本。这可能不是您想要的。如果想返回与路径匹配的(第一个)元素的文本内容,您应该编写:
get_val = lambda item, path: item.xpath(path)[0].text if item.xpath(path) else ""\nRun Code Online (Sandbox Code Playgroud)\n\n请注意,xpath返回一个列表。我假设该列表中只有一个元素。
输出是这样的:
\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\nRun Code Online (Sandbox Code Playgroud)\n\n但我认为你想要一个链接,而不是文本。如果是这种情况,请阅读下文。
\n\n好吧,如何获取链接?当您有一个锚点时a,您可以href在属性表中获得它(链接)a.attrib["href"]:。
据我了解,在价格的情况下,您需要文本,但在锚点的情况下,您需要一个特定属性 href 的值。这是 lambda 的真正用途。像这样重写你的函数:
\n\ndef get_val(item, path, l):\n return l(item.xpath(path)[0]) if item.xpath(path) else ""\nRun Code Online (Sandbox Code Playgroud)\n\n参数l是应用于节点的函数。l可以返回节点的文本,或锚点的 href:
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)\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
381 次 |
| 最近记录: |